配列
■概要
配列は1つの変数に複数のデータを格納する場合に使用します。
配列を使用するにはまず最大でいくつのデータを使用するかという要素数を決めます。
要素数を指定して作成された配列には番号が振られており、その番号を要素番号と呼びます。
要素番号は基本的には「0」から始まり、番号を指定することでその配列番号の
配列にアクセスできます。
■書式
●書式例
Dim 変数名(要素数) As データ型
●具体例
Sub ListTest()
Dim int_list(3) As Integer
Dim i As Integer
For i = 0 To 3
int_list(i) = i
Next i
For i = 0 To 3
Debug.Print int_list(i)
Next i
End Sub
実行結果:
イミディエイトウィンドウに0~3と表示される
上の具体例でlistという名前の配列を定義し、要素数は3にしています。
CやC++と異なり、「要素数 = 配列の数」では無いことに注意して下さい。
0も要素の数に含まれます。
■動的配列
上で説明した配列は「静的配列」と呼ばれ、宣言時に要素数を設定します。
静的配列とは逆に宣言時に要素数を決めずに、必要に応じて後から要素数を決める配列を
「動的配列」と呼びます。
●動的配列の宣言
動的配列の宣言は本来要素数を記述する箇所を空白にすることで行うことができます。
・書式
書式例:
Dim 変数名() As データ型
具体例:
Dim int_list() As Integer
●動的配列の要素決め
動的配列の要素決めを決める際は「ReDimステートメント」を使用します。
ReDimの後に配列(要素数)を指定することで
配列に指定した要素数が割り振られます。
・書式
書式例:
ReDim 変数名(要素数)
具体例:
ReDim int_list(3)
int_list(0) = 1
int_list(1) = 10
int_list(2) = 100
int_list(3) = 1000
Debug.Print int_list(3)
実行結果:
イミディエイトウィンドウで1000と表示される
●ReDimの複数使用
ReDimは何度使用しても効果を発揮します。
例:
' 1度目のReDim
ReDim int_list(1)
int_list(0) = 0
int_list(1) = 1
' 2度目のReDim
ReDim int_list(2)
int_list(2) = 10
Debug.Print int_list(2)
実行結果:
イミディエイトウィンドウで10と表示される
上の例のように始めのReDimで要素数を1に設定していますが
2回目のReDimで要素数を2に増やしています。
その後、要素番号2に数値を代入していますが、
エラーになることもなく問題なく動作します。
このようにReDimは動的配列に対し、何度も使用することが可能です。
●ReDimの注意点
ReDimを使用した場合、配列に保存してあったデータは全て消えます。
例:
Dim int_list() As Integer
ReDim int_list(1)
int_list(0) = 10
MsgBox int_list(0)
ReDim int_list(2)
MsgBox int_list(0)
実行結果:
1度目のメッセージボックス => 10
2度目のメッセージボックス => 0
上の例のようにReDimを使用した場合、元々あった配列の情報は
全て消されてしまうので注意して下さい。
●ReDimでデータを消させないようにする方法
上でReDimを使用すると元の配列情報が消されると記述していますが
データを引き継ぐ方法があります。
配列に格納されているデータを引き継ぐには「Preserveステートメント」を使用します。
・書式
書式:
ReDim Preserve 変数名(要素数)
具体例:
Dim int_list() As Integer
ReDim int_list(1)
int_list(0) = 10
MsgBox int_list(0)
ReDim Preserve int_list(2)
MsgBox int_list(0)
実行結果:
2回ともメッセージボックスの表示は10
具体例の結果で分かるようにPreserveを使用すると古い配列のデータが
新しく用意される配列に引き継がれます。
■配列の応用
●配列の要素範囲指定
VBAの配列は必ず0から始まらなければいけないということはなく、
4や10といった別の値から開始することが可能です。
・書式
書式例:
Dim 変数名(開始値 To 終了値) As データ型
具体例:
Dim int_list(3 To 5) As Integer
上の具体例は要素番号3から5まで使用できる配列が宣言されたことになります。
もちろん、他の0~2の要素番号を指定するとエラーになります。
●配列数の取得
VBAの配列の数は要素数の最も小さい値と最も大きい値を取得して調べます。
このようにする理由は上の「●配列の要素番号指定」で最小の値が0ではないからです。
・最小の要素番号取得
最小の要素番号を取得するにはLBound関数を使用します。
LBound:
最小値 LBound(配列名, 配列の次元番号)
戻り値:
成功:最小値
失敗:エラーで停止
第一引数:
最小値を調べたい配列名
第二引数:
調べたい配列の次元番号(省略化)
内容:
配列の最小値を返す
具体例:
Dim int_list(3 To 5) As Integer
MsgBox LBound(int_list)
実行結果:
メッセージボックスに3が表示される
・最大の要素番号取得
最大の要素番号を取得するにはUBound関数を使用します。
UBound:
最小値 UBound(配列名, 配列の次元番号)
戻り値:
成功:最大値
失敗:エラーで停止
第一引数:
最大値を調べたい配列名
第二引数:
調べたい配列の次元番号(省略化)
内容:
配列の最大値を返す
具体例:
Dim int_list(3 To 5) As Integer
MsgBox UBound(int_list)
実行結果:
メッセージボックスに5が表示される