Excel VBAの配列にはどんな種類があるのか - 静的配列と動的配列 -
はじめに
前回は多次元配列について説明しました。
今回は静的配列と動的配列について説明します。
◆目次◆
静的配列とは
今まで、「配列は箱の集合体のようなもの」と説明しました。
静的配列は、この箱の数(配列の要素数)が決まっているときに使う配列のことです。
つまり、前回と前々回で説明していた配列は、静的配列を説明していたことになります。
動的配列とは
箱の数(配列の要素数)が決まっていないときに使う配列のことです。
Excel VBAの場合、配列の要素数を変更するときは「配列の要素数(インデックスの範囲)を○○に変えます」という宣言が必要です。
これが配列を難しくしてしまう原因の1つだと思います。
コードの書き方は以下のとおりです。
Sub プロシージャ名() '配列の変数をインデックスの範囲を指定せずに宣言する Dim 配列名() As データ型 'ReDim Preserveステートメント を使ってインデックスの範囲を宣言しなおす ReDim Preserve 配列名(インデックスの範囲) '配列に値を格納する 配列名(インデックス) = 配列に追加したい要素 '配列に要素を増やしたいときは、もう一度ReDim Preserveステートメント を使ってインデックスの範囲を宣言しなおす ReDim Preserve 配列名(インデックスの範囲) 配列名(インデックス) = 配列に追加したい要素 End Sub
もしもReDim Preserveステートメントを使わずに配列の要素数を変えようとすると、以下のエラーが出ます。
実行時エラー'9': インデックスが有効範囲にありません。
動的配列を扱うときは、必ずReDim Preserveステートメントを使いましょう。
では、動的配列について、例を上げて説明します。
1次元配列の動的配列
たとえば、「Juice」という値を配列に追加したい場合、以下の図のように箱をもう1つ用意する必要があります。
1次元配列の動的配列の場合は、注意点は2つです。
- 配列の変数を宣言するときに、インデックスの範囲を指定しない
- ReDim Preserveステートメントを使って、インデックスの範囲を指定する
これをふまえて、配列に「Juice」を追加するコードを書きます。
Sub array2_1() Dim drinks() As String ReDim Preserve drinks(2) drinks(0) = "Coffee" drinks(1) = "Tea" drinks(2) = "Milk" ReDim Preserve drinks(3) drinks(3) = "Juice" End Sub
ローカルウィンドウで結果を見ると、「drinks(3)」 に「Juice」が入っていますね。配列の要素数を増やすことに成功しました。
2次元配列の動的配列
基本的には1次元配列の動的配列と同じです。 ReDim Preserveステートメントを使って配列の要素数を変更します。 ただし、ReDim Preserveステートメントを使って変更できるのは「配列の最後の次元のみ」ということに注意が必要です。
2次元配列の動的配列の場合は、1次元配列の注意点に加えて以下を注意してください。
- 配列の要素数を変更できるのは2次元目のみ
では、「Orange Juice」と「Apple Juice」という値を配列に追加します。
Sub array1_6() Dim drinks() As String ReDim Preserve drinks(1, 2) drinks(0, 0) = "American Coffee" drinks(0, 1) = "Earl Grey Tea" drinks(0, 2) = "Almond Milk" drinks(1, 0) = "Blended Coffee" drinks(1, 1) = "Ceylon Tea" drinks(1, 2) = "Soy Milk" ReDim Preserve drinks(1, 3) drinks(0, 3) = "Orange Juice" drinks(1, 3) = "Apple Juice" End Sub
こちらもローカルウィンドウで結果を見ると、意図したとおりに配列に要素が追加できました。
さて・・・ここで気になるのは、「2次元配列で1次元目の要素数を変えたいときはどうするのか」ということですよね。
実は、もう1つ配列を作って処理を行う必要があります。 ここもExcel VBAの配列がわかりにくい要素の1つです。
少しお話すると、TRANSPOSE関数を使って配列の次元を交換します。詳しくは、「セルを使った2次元配列の動的配列のコードの書き方」を説明する際に書きますので、しばらくお待ちください。
さいごに
配列の種類の説明はここで終わりです。動的配列を宣言するときにひと手間あるので注意が必要ですね。
次回以降からはExcelファイルのセルを使ったコードの書き方を説明します。