LoginSignup
1
2

More than 1 year has passed since last update.

VBA、関数によって配列のインデックス最小値が異なる

Last updated at Posted at 2018-12-28

ストーリー

縦長のセル範囲に配列を貼り付けようとしたときに、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

myArrayAmyArrayDをセルに代入する部分があるが、思うように代入できるのは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!

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2