Developer

【ExcelVBA】動的配列
2021.06.21
Lv1

【ExcelVBA】動的配列

静的配列と動的配列

前回、配列を紹介しました。
配列は複数の値を格納するために使うことができる変数が連なったものとなります。
10個の数値を格納する配列を用意する場合、以下のように宣言をします。

Sub VBA基礎第22回_1()
    Dim score(9) As Integer
  
End Sub

このようにあらかじめ要素数を指定して使用する配列を静的配列といいます。
あらかじめ要素数が確定している場合、上記の構文で配列の宣言はできるのですが、コードの実行にはいくつの要素数が必要なのかがわからないこともよくあります。
例えばあるファイルの中に書いてあるデータを読み取って格納しなければならないがファイルの中のデータ数は日によって異なるといったようなケースです。
この場合あらかじめ要素数を指定することができません。
こうした場合に対応できるように最初は要素数を指定せずに後から指定することができるようになっています。
このような後から指定する配列を動的配列といいます。
その時の状況によって柔軟に変化させることができることを動的といいます。

動的配列の宣言とデータへのアクセス

動的配列の宣言は以下のようになります。

Dim 配列名() as 型

静的配列との違いは、()の中にインデックス番号を指定しないところです。
とりあえず使う予定の配列名を指定しているだけといった感じになります。
ただ宣言しただけの状態では、要素数の指定を行っていないためデータを格納することはできません。インデックス番号0を指定してもエラーとなります。
そのため実際に値を格納するには、要素数がわかった時点で要素数を指定する必要があります。
指定するには以下のようにします。

ReDim 配列名(インデックス番号の上限)

この場合、インデックス番号は0からスタートします。
最初のインデックス番号を指定することもできます。

ReDim 配列名(インデックス番号の最初 to インデックス番号の上限)

後から要素数3個必要な動的配列を作成する場合は、以下のように行います。

Sub VBA基礎第22回_2()
    Dim score() As Integer	'動的配列の宣言
    ReDim score(2)		'要素数の指定
    
    score(0) = 90
    score(1) = 81
    score(2) = 92
    
    MsgBox "合計値は" & score(0) + score(1) + score(2)
    
    
End Sub

このReDimですが動的配列として宣言した配列であれば何度も実行できます。
例えば以下のようにです。

Sub VBA基礎第22回_3()
    Dim score() As Integer
    ReDim score(2)
    
    score(0) = 90
    score(1) = 81
    score(2) = 92
    
    MsgBox "合計値は" & score(0) + score(1) + score(2)
    
    ReDim score(3)
    
    MsgBox "合計値は" & score(0) + score(1) + score(2)   
End Sub

最初は要素数を3(0~2)にしていますが、2回目のRedimで要素数を4(0~3)としています。
ただしReDimを実行するたびに配列が新しく作り直されてしまうため、最初に入っていた90、81、92は消えてしまいます。
実際に上記のコードを実行すると1回目のメッセージボックスには合計値は263 と表示されますが、2回目は 合計値は0 となります。
もし最初に格納している値を保持したい場合は、以下のように要素数を指定します。

ReDim Preserve 配列名(インデックス番号の上限)

先ほどのコードを少し変更してみます。

Sub Sample()
    Dim score() As Integer
    ReDim score(2)
    
    score(0) = 90
    score(1) = 81
    score(2) = 92
    
    MsgBox "合計値は" & score(0) + score(1) + score(2)
    
    ReDim Preserve score(3)
    
    MsgBox "合計値は" & score(0) + score(1) + score(2)  
End Sub

実行結果は2回表示されるメッセージボックスの内容はいずれも 合計値は263 となります。

まとめ

配列には静的配列と動的配列があります。
あらかじめ要素数が確定しており、宣言時に要素数を指定する配列が静的配列になります。
配列を宣言の際に要素数を指定せず、コードを実行している際の状況によって要素数を変化させることのできる配列が動的配列となります。
ReDimを使用して要素数を後から指定します。

確認問題

以下の「○○○」に当てはまる文言を解答してください。

配列を宣言の際に要素数を指定せず、コードを実行している際の状況によって要素数を変化させることのできる配列が○○○となります。
○○○を使用して要素数を後から指定します。

答え


配列を宣言の際に要素数を指定せず、コードを実行している際の状況によって要素数を変化させることのできる配列が動的配列となります。
ReDimを使用して要素数を後から指定します。

次回は、「配列の操作」です。

 
 

連載目次リンク

ExcelVBA 入門 連載目次