EXCEL VBA - 配列の基本

配列とは

配列とは、情報を格納する変数のひとつで、複数の変数が連なっている状態です。以下の例では、ひとつの変数 (List) に対して、複数の値を格納しています。

Dim List(3) As Integer

List(0) = 0
List(1) = 1
List(2) = 2
List(3) = 3
配列の基本

最初の配列の宣言で List は 0 ~ 3 までの 4 つの値を格納できるように領域を確保します。それぞれの領域を区別するために変数名の値に添字 (インデックス)と呼ばれる値を付与します。例えば、List の 0 番目の領域にアクセスしたい場合は List(0) のように記述します。このように配列のひとつひとつの領域は、配列の要素と言います。

配列の各要素は、添字を変更することで順番に取り出すことができます。

Dim List(3) As Integer

List(0) = 0
List(1) = 1
List(2) = 2
List(3) = 3

Dim i As Integer
For i = 0 To 3
    Debug.Print (List(i))
Next i
配列の基本

配列の宣言

配列は、以下のように宣言します。

Dim 変数名(配列の要素数 - 1) As データ型
配列の宣言

VBA では、配列の領域をいくつ確保するか最初に宣言する必要があります。配列は、0 番目の要素から数えるため、10 個の要素を持つ配列を宣言する場合は、変数名(9) のように宣言します。以下の例では、10 個の要素を持つ String 型の配列になります。

Dim str(9) As String
配列の宣言

通常、配列の宣言における添字は 0 から始まりますが、添字は任意の範囲に変更することができます。例えば、添字が 3 から始まり 6 で終わる配列を宣言するには以下のように宣言します。

Dim str(3 To 6) As String

str(3) = "index 3"
str(4) = "index 4"
str(5) = "index 5"
str(6) = "index 6"
配列の宣言

無効なインデックス

配列は、宣言された領域を超えた添字でアクセスした場合、「インデックスが有効範囲にありません。」というエラーを返します。このエラーは、コンパイル時にはエラーとはならず、実行した場合にエラーとなります。

インデックスエラー
インデックスエラー

動的配列

動的配列は、要素数を定義せずに宣言する配列です。配列の宣言時点では、要素数が確定しない場合に用いられます。ただし、要素数が定義されていないと使えないため、動的配列を使えるようにするには要素数を再定義 (ReDim) します。

Dim str() As String

ReDim str(3)
動的配列と再定義

要素数の再定義 (ReDim) は何度でも実行できます。

Dim str() As String

ReDim str(1)
str(0) = "0"
str(1) = "1"

ReDim str(2)
str(2) = "2"
動的配列と再定義

ただし、動的配列の再定義には重要なポイントがあります。それは、再定義した時点でそれまでのデータがクリアされてしまうことです。上記の例では、ReDim を 2 回行っていますが、2 回目の ReDim の時点で "0""1" はクリアされています。

データをクリアせずに再定義を行うためには Preserve キーワードを付与します。

Dim str() As String

ReDim str(1)
str(0) = "0"
str(1) = "1"

ReDim Preserve str(2)
str(2) = "2"
動的配列と再定義

動的配列は、再定義を行うことで要素数が変化します。そのため、配列の要素数を調べるために LBound 関数と、UBound 関数が用意されいます。LBound 関数は、引数で指定した配列で使用できるもっとも小さいインデックス番号を返します。UBound 関数は、引数で指定した配列で使用できるもっとも大きいインデックス番号を返します。以下の例では、要素数を計算しています。

Dim str() As String

ReDim str(1)
str(0) = "0"
str(1) = "1"

Dim i As Integer
i = UBound(str) - LBound(str) + 1
Debug.Print (i)
動的配列と再定義

これらの関数を使うことで、動的配列の要素に対しても繰り返し文でアクセスすることもできます。

Dim str() As String

ReDim str(1)
str(0) = "0"
str(1) = "1"

Dim i As Integer
For i = LBound(str) To UBound(str)
    Debug.Print(str(i))
Next i
動的配列と再定義

関連記事