VBA配列は他言語と比べると少し特殊です。他言語を経験した方が最初に躓くのは配列ではないかと思います。今回、静的配列について悩んだ際に最初に見るべきリファレンスとして記事をまとめました。
動的配列について知りたい方は、以下の記事にまとめていますので参照してください。
静的配列の宣言
静的配列を宣言する際は、インデックス下限と上限を指定します。下限値は省略可能で、省略時は0を指定したものとみなされます。インデックス上限の考え方が他言語と異なるので注意してください。
'Dim 配列名(下限 To 上限) As データ型名
'Dim 配列名(上限) As データ型名
Dim ary(0 to 10) as Integer
Dim ary(10) as Integer 'Dim ary(0 to 10) と同義
' ary(0), ary(1), ary(2), ・・・・, ary(8), ary(9), ary(10) に値を代入することができます
' 注意点としては、ary(10)まで値を代入できることです。
多次元静的配列の宣言
多次元静的配列を宣言する際は、必要な次元数を「,」カンマで区切ります。下限値については同様に省略可能で、省略時は0を指定したものとみなされます。
'Dim 配列名(下限 to 上限, 下限 to 上限, 下限 to 上限, ・・・) As データ型名
'Dim 配列名(上限, 上限, 上限, ・・・) As データ型名
Dim ary(0 to 3, 0 to 10, 0 to 5) as Integer
Dim ary(3, 10, 5) as Integer 'Dim ary(0 to 3, 0 to 10, 0 to 5) と同義
' ary(0,0,0), ary(0,0,1), ・・・ , ary(3, 10, 4), ary(3, 10, 5) に値を代入することができます
静的配列の要素数の取得(配列上限値、下限値の取得)
配列のループ処理では、配列の要素数でループ回数を決めると思います。しかし、VBAでは要素数を求める仕組みがありません。配列の上限値・下限値は取得できるため、上限値から下限値を引くことで要素数を求めます。上限値を求めるには「UBound (Upper Bound)」、下限値を求めるには「LBound (Lower Bound)」を使用します。多次元配列の場合は、UBound/LBoundの第2引数に次元数を指定します。
Dim ary(10) As Integer
Debug.Print LBound(ary) '0
Debug.Print UBound(ary) '10
Debug.Print UBound(ary)-LBound(ary)+1 '11
要素数
Dim ary2(5 To 7) As Integer
Debug.Print LBound(ary2) '5
Debug.Print UBound(ary2) '7
Debug.Print UBound(ary2)-LBound(ary2)+1 '3 要素数
Dim ary3(3, 5, 7) As Integer
Debug.Print UBound(ary3) '3
Debug.Print UBound(ary3, 1) '3 UBound(ary3)と同義
Debug.Print UBound(ary3, 2) '5
Debug.Print UBound(ary3, 3) '7
静的配列の初期化・削除
文字列配列の場合は空文字、数値配列の場合は0で初期化がされます。また静的配列自体を削除する場合はErase文を使います。
Dim ary(3) As String
ary(0) = "1"
ary(1) = "2"
ary(2) = "3"
ary(3) = "4"
Debug.Print Join(ary) ' 1 2 3 4
Erase ary
Debug.Print Join(ary) ' 何も出力されない
' Debug.Print LBound(ary), UBound(ary); ' 上限下限は存在しない。エラーとなる。