【VBA】配列の縦横変換|WorksheetFunction.Transpose は使わない
作成日:2022-12-04
更新日:2025-10-02

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|転置 |
2022-12-04
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-

[VBA]Vertical Paste1D array 【VBA】一次元配列を縦方向にシートに貼り付け【範囲をリサイズする】 -

[VBA]fsoSingleton pattern 【VBA】FSO(“Scripting.FileSystemObject”)|シングルトン化して使う -

CurrentRegionのデータを配列で取得 【VBA】シートにあるデータを配列に格納する(空白含まない)|CurrentRegion -

[VBA]Control the calculation再計算 【VBA】指定のシートを再計算する|Calculate -

[VBA]画像として貼り付けCopyPicture 【VBA】セル範囲を画像としてコピーする|CopyPicture -

dictionaryをセットする 【VBA】Dictionaryのセット|CreateObject(“Scripting.Dictionary”)