Excel VBAで配列を動的に変更する方法のまとめ
Excel VBAで配列を動的に変更する方法のまとめです。
1.配列の基本
動的変更の説明の前に、静的な配列変数の定義は次のように行います。
Sub Test()
Dim foo(2) As String
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
End Sub
通常の変数宣言と同様、Dimで宣言し、変数名の直後に配列変数の「0から数えたときの上限値」を指定します。
Dim foo(2) As String
上記の例では「2」を設定しているので、配列のサイズは「3」になります。
宣言時に上限値を設定しているので、処理の中でいつでも配列に値を設定することができます。
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
2.ReDimで配列のサイズを設定する
処理の途中で配列のサイズを設定する場合、DimとReDimを組み合わせます。
Sub Test()
Dim foo() As String
'処理...
ReDim foo(2)
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
End Sub
ReDimを使って要素数を指定する場合、最初の宣言ではカッコのみ記述し、上限値は設定しません。
Dim foo() As String
上限値を設定して後続のReDimを行うと「配列は既に宣言されています」というコンパイルエラーになります。
その後、ReDimで上限値を指定します。
ReDim foo(2)
上限値を設定すれば配列に値を設定することができます。
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
3.Preserveで変更前の内容を保持する
処理の途中で配列のサイズを動的に増やす場合、サイズを変更したときに、
- 配列の内容を保持する
- 配列の内容を保持しない
の2通りを選択できます。
サイズを変更したときに配列の内容を保持する場合、ReDimにPreserveを与えます(赤色部分)。
Sub Test()
Dim foo() As String
ReDim foo(2)
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
ReDim Preserve foo(5)
MsgBox foo(0)
End Sub
上記のサンプルを実行すると、MsgBoxで指定したfoo(0)の内容「a」が表示されます。
逆に、サイズを変更したときに配列の内容を保持しない場合、ReDimにPreserveを与えません。
Sub Test()
Dim foo() As String
ReDim foo(2)
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
ReDim foo(5)
MsgBox foo(0)
End Sub
上記のサンプルを実行すると、MsgBoxで指定したfoo(0)では何も表示されません。
4.配列のサイズを動的に減らす
3項の逆で、ReDimを使って配列のサイズを動的に減らすことも可能です。
Sub Test()
Dim foo() As String
ReDim foo(2)
foo(0) = "a"
foo(1) = "b"
foo(2) = "c"
ReDim Preserve foo(1)
End Sub
減らす場合、上限値を超えた元の要素にアクセスすることはできません。
上記の例では、上限値「2」を「1」に減らしたあと、foo(2)にアクセスすることはできません。
また、Preserveの使い方は動的に増やす場合と同様です。
5.配列のサイズを動的に増やすサンプル1
for文の中で配列のサイズを動的に増やすサンプルを示します。
Sub Test()
Dim i As Integer
Dim foo() As String
For i = 0 To 9
ReDim Preserve foo(i)
foo(i) = i
Next i
For i = 0 To UBound(foo)
MsgBox foo(i)
Next i
End Sub
6.配列のサイズを動的に増やすサンプル2
処理の中で配列のサイズが不明な場合、UBoundを使って配列のサイズを1つ増やすサンプルを示します。
Sub Test()
Dim i As Integer
Dim foo() As String
'処理...
Dim size As Integer
size = UBound(foo)
ReDim Preserve foo(size + 1)
foo(size + 1) = "OK"
End Sub
UBound関数で配列変数fooの上限値を取得し、変数sizeに保持します。
size = UBound(foo)
「上限値+1」でReDimを実行します。
ReDim Preserve foo(size + 1)
「上限値+1」の要素に値を設定します。
foo(size + 1) = "OK"