Excel VBAで配列を初期化する・再定義する:Erase,Array
VBAで配列を初期化するときには、Eraseステートメントや、Arrayステートメントを使います。以下で詳しく見ていきましょう。
配列の初期化とは
配列の初期化という場合は、2通りの意味があります。
・配列に入っている要素だけを初期化する(数値は全て0、文字列は長さ0の文字列等)
・配列の要素と、配列に格納出来る要素数を初期化する
それぞれの場合で方法が異なりますので、以下説明します。
配列の初期化方法1:Eraseステートメント
Excel-VBAで配列の初期化を行なう場合、Eraseステートメントを下記のように使います。
Erase 配列名
静的配列(配列に入る要素数が固定)の場合は、配列に入っている要素を0や長さ0の文字列で置き換え、配列の要素数は最初の定義のままとなります。従って、この時点ではメモリ上で配列用に確保した領域は解放されていませんが、これについてはマクロ実行終了と同時に解放されます。
動的配列(配列に入る要素数が可変)の場合は、配列の要素もメモリ上の領域も合わせて解放するという、文字通りの初期化を行ないます。
配列の初期化方法2:Array()ステートメント(動的配列のみ可能)
動的配列に限り、下記の方法でも初期化が可能です。静的配列では使用できませんので注意が必要です。
マクロ例:
Sub Array_Sample()
Dim preArray() As Variant
'配列preArray(0)=100, preArray(1)=230, preArray(2)=300を格納
preArray = Array(100, 230, 300)
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=3
MsgBox preArray(0) 'preArray(0)=100が表示される
preArray = Array() '要素が空の配列を代入(初期化)
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=0
MsgBox preArray(0) '存在しないのでここで実行時エラーとなる
End Sub
UBound関数とLBound関数は、あわせて配列のサイズを調べる際に多く使われます。UBound関数が配列で指定した中のインデックス番号の最大値を、LBound関数が最小値を返します。要素が空の配列を代入することによって、配列の初期化が可能です。
マクロ作成・実行上の注意点
下記の方法では、配列の初期化は出来ません(実行時エラーとなり、処理が中断します)。
マクロ例:
Sub ReDim_Sample_03()
Dim preArray() As Variant
'配列preArray(0)=100, preArray(1)=230, preArray(2)=300を格納
preArray = Array(100, 230, 300)
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=3
MsgBox preArray(0) 'preArray(0)=100が表示される
'配列に直接0を代入しようとしたが、この時点で実行時エラーが発生する。
preArray=0
'これ以降は処理されない
MsgBox UBound(preArray) - LBound(preArray) + 1
MsgBox preArray(0)
End Sub
上述の通り、配列に直接0を代入することはできません。
また、動的配列で要素数を再定義するために使用するReDimステートメントを、予め要素が入っている動的配列に対し実行すると初期化したのと同じこととなってしまいます。
マクロ例:
Sub ReDim_Sample_01()
Dim preArray() As Variant
'配列preArray(0)=100, preArray(1)=230, preArray(2)=300を格納
preArray = Array(100, 230, 300)
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=3
MsgBox preArray(0) 'preArray(0)=100が表示される
ReDim preArray(4) '配列の要素数を3から5に変更
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=5
MsgBox preArray(0) 'preArray(0)=空要素(何も表示されない)
End Sub
この場合、ReDim直前までpreArray(0)の要素として入っていた100が、ReDimによって配列そのものを再定義されてしまったため、要素も全て消去されていまいました。
動的配列ではこのような意図しない初期化をしてしまう事がありますので、予め配列に入れた要素を消さないで再定義する場合はReDim Preserve ステートメントを使用します。
マクロ例:
Sub ReDim_Sample_02()
Dim preArray() As Variant
'配列preArray(0)=100, preArray(1)=230, preArray(2)=300を格納
preArray = Array(100, 230, 300)
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=3
MsgBox preArray(0) 'preArray(0)=100が表示される
'配列の要素数を3から5に変更(Preserveによって要素は消去されず)
ReDim Preserve preArray(4)
MsgBox UBound(preArray) - LBound(preArray) + 1 'この時点での配列の要素数=5
MsgBox preArray(0) 'preArray(0)=100が表示される
End Sub