ストーリー
縦長のセル範囲に配列を貼り付けようとしたときに、Transpose関数の仕様で泣きそうになったので、Option Base
の切替も含めて表にまとめた。「Transposeなんてもう使わない!」と心に決めたが縦に伸びる配列ではReDim Preserve
が使えないことが分かり玉砕。いやいや、「メモリの書き換えが複雑にならないようにするため最後の次元以外は後から変更できない仕様です」なんて聞いてません、勘弁してください。というか(1次元目,2次元目)と(行数,列数)の対応関係がどうしてこうなった!と嘆いた結果たどり着いた境地。
テストコード
サンプルコード
module1
Option Base 1 '「0,1」切替
Sub test()
Dim mySheet1 As Worksheet
Set mySheet1 = ThisWorkbook.Worksheets(1)
myArrayA = Array(1, 2, 3, 4, 5)
myArrayB = Split("a,b,c,d,e", ",")
ReDim myArrayC(4)
For i = 0 To (UBound(myArrayC) - LBound(myArrayC))
myArrayC(LBound(myArrayC) + i) = Chr(Asc("A") + i)
Next
myArrayD = WorksheetFunction.Transpose(myArrayC)
Debug.Print ">>>>>>>>>>start"
Debug.Print "Array:(" + CStr(LBound(myArrayA)) + " To " + _
CStr(UBound(myArrayA)) + ")"
Debug.Print "Split:(" + CStr(LBound(myArrayB)) + " To " + _
CStr(UBound(myArrayB)) + ")"
Debug.Print "myArray:(" + CStr(LBound(myArrayC)) + " To " + _
CStr(UBound(myArrayC)) + ")"
Debug.Print "Transpose:(" + CStr(LBound(myArrayD, 1)) + " To " + _
CStr(UBound(myArrayD, 1)) + "," + _
CStr(LBound(myArrayD, 2)) + " To " + _
CStr(UBound(myArrayD, 2)) + ")"
Debug.Print ">>>>>>>>>>finish"
With mySheet1
.Range(.Cells(2, 1), .Cells(6, 1)) = myArrayA
.Range(.Cells(2, 2), .Cells(6, 2)) = myArrayB
.Range(.Cells(2, 3), .Cells(6, 3)) = myArrayC
.Range(.Cells(2, 4), .Cells(6, 4)) = myArrayD
End With
End Sub
myArrayA
~myArrayD
をセルに代入する部分があるが、思うように代入できるのはmyArrayD
のみ。
他は配列の最初の要素が全てのセルに代入される。
各要素の次元数
Option Base 0
の場合
Name | 1次元目の最小値 | 1次元目の最大値 | 2次元目の最小値 | 2次元目の最大値 |
---|---|---|---|---|
Array | 0 | 4 | - | - |
Split | 0 | 4 | - | - |
myArray | 0 | 4 | - | - |
Transpose | 1 | 5 | 1 | 1 |
Option Base 1
の場合
Name | 1次元目の最小値 | 1次元目の最大値 | 2次元目の最小値 | 2次元目の最大値 |
---|---|---|---|---|
Array | 1 | 5 | - | - |
Split | 0 | 4 | - | - |
myArray | 1 | 4 | - | - |
Transpose | 1 | 4 | 1 | 1 |
結果
Option Base 0
の場合
イミディエイトウィンドウ
>>>>>>>>>>start
Array:(0 To 4)
Split:(0 To 4)
myArray:(0 To 4)
Transpose:(1 To 5,1 To 1)
>>>>>>>>>>finish
Option Base 1
の場合
イミディエイトウィンドウ
>>>>>>>>>>start
Array:(1 To 5)
Split:(0 To 4)
myArray:(1 To 4)
Transpose:(1 To 4,1 To 1)
>>>>>>>>>>finish
セルへの代入結果
`Option Base 0` の場合
A | B | C | D | |
---|---|---|---|---|
myArrayA | myArrayB | myArrayC | myArrayD | |
1 | 1 | a | A | A |
2 | 1 | a | A | B |
3 | 1 | a | A | C |
4 | 1 | a | A | D |
5 | 1 | a | A | E |
`Option Base 1` の場合
A | B | C | D | |
---|---|---|---|---|
myArrayA | myArrayB | myArrayC | myArrayD | |
1 | 1 | a | A | A |
2 | 1 | a | A | B |
3 | 1 | a | A | C |
4 | 1 | a | A | D |
5 | 1 | a | A | #N/A |
Excelsior!