銀河鉄道

【VBA】配列の縦横変換|WorksheetFunction.Transpose は使わない

サムネイル
[VBA]Transpose2D Array

2次元配列の縦横変換

' Transpose a 2D Variant array; preserve caller's base
' 2次元Variant配列を転置。呼び出し側の基底を維持。

Public Function TransposeArray(ByRef ary As Variant) As Variant
	' Basic validation|基本検証
	If Not IsArray(ary) Then
		Err.Raise 5, "TransposeArray", "Input must be an array|配列を渡してください"
	End If

	' Get bounds for dim1 and dim2; if dim2 fails, it's not 2-D
	' 第2次元の境界が取れない場合は2次元ではないとみなす
	Dim rL As Long, rU As Long
	Dim cL As Long, cU As Long

	On Error GoTo Not2D
	rL = LBound(ary, 1): rU = UBound(ary, 1)
	cL = LBound(ary, 2): cU = UBound(ary, 2)
	On Error GoTo 0

	' Allocate result with swapped dimensions; keep bases
	' 次元を入れ替え、基底はそのまま
	Dim tmp As Variant
	ReDim tmp(cL To cU, rL To rU)

	' Transpose core|転置本体
	Dim r As Long, c As Long
	For r = rL To rU
		For c = cL To cU
			tmp(c, r) = ary(r, c)
		Next c
	Next r

	TransposeArray = tmp
	Exit Function

Not2D:
	Err.Clear
	Err.Raise 5, "TransposeArray", "Only 2D arrays are supported|2次元配列のみ対応"
End Function

使い方の確認例|Usage sanity checks

  • 入力 (0 To 2, 0 To 1) → 出力 (0 To 1, 0 To 2)(両次元とも0基底を維持)。
  • 入力 (1 To 3, 0 To 4) → 出力 (0 To 4, 1 To 3)各次元ごとの基底を入れ替えて保持)。

notes

  • ByRef Variant|参照渡しは巨大配列のコピーを避けられる。読み取り専用なら ByRef のままでOK
  • 2重ループは不可避やけど、境界値をループ外でキャプチャして分岐/関数呼び出しを避けると速い。

WorksheetFunction.Transpose は避ける|Why no WorksheetFunction.Transpose?

WorksheetFunction.Transpose

データ量が多いとエラーになる

  • Size quirks and type coercion can bite in automation scenarios
  • サイズ制約や型変換が問題になり得るため

| Caller’s Base|呼び出し側の基底 |
| Bounds|境界 |
| Dimension Swap|次元の入れ替え |
| Guard Clause|ガード節 |
| ByRef|参照渡し |
| Variant Array|Variant配列 |
| Defensive Programming|防御的プログラミング |
| Lower Bound (LBound)|下限(LBound) |
| Upper Bound (UBound)|上限(UBound) |
| Transpose|転置 |

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧