【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]Nameでパス変更 【VBA】ブックのフルパスを変更する(ファイル名の変更も含む)|Name -
ユーザーフォームを半透明にする 【VBA】ユーザーフォームを半透明にしてシートの内容が見えるようにする|waiting-form -
シート名でシート取得 【VBA】シートをシート名で取得する|Worksheets(name) -
日付型に変える 【VBA】CDateで文字列を日付型に変える -
Let と Getで読み取り専用 【VBA】クラスのプロパティを読み取り専用にするLet と Getの書き方 -
[VBA]Paste 2D Arrayresize once 【VBA】二次元配列をシートに貼り付け【範囲をリサイズする】