Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Excel VBAの配列にはどんな種類があるのか - 静的配列と動的配列 -

はじめに

前回は多次元配列について説明しました。

lbibouroku.hatenablog.com

今回は静的配列と動的配列について説明します。

◆目次◆

静的配列とは

今まで、「配列は箱の集合体のようなもの」と説明しました。
静的配列は、この箱の数(配列の要素数)が決まっているときに使う配列のことです。
つまり、前回と前々回で説明していた配列は、静的配列を説明していたことになります。

動的配列とは

箱の数(配列の要素数)が決まっていないときに使う配列のことです。

f:id:lbibouroku:20210821110756p:plain

Excel VBAの場合、配列の要素数を変更するときは「配列の要素数(インデックスの範囲)を○○に変えます」という宣言が必要です。

これが配列を難しくしてしまう原因の1つだと思います。

コードの書き方は以下のとおりです。

Sub プロシージャ名()

    '配列の変数をインデックスの範囲を指定せずに宣言する
    Dim 配列名() As データ型

    'ReDim Preserveステートメント を使ってインデックスの範囲を宣言しなおす
    ReDim Preserve 配列名(インデックスの範囲)

    '配列に値を格納する
    配列名(インデックス) = 配列に追加したい要素
    
    '配列に要素を増やしたいときは、もう一度ReDim Preserveステートメント を使ってインデックスの範囲を宣言しなおす
    ReDim Preserve  配列名(インデックスの範囲)
    配列名(インデックス) = 配列に追加したい要素

End Sub

もしもReDim Preserveステートメントを使わずに配列の要素数を変えようとすると、以下のエラーが出ます。

実行時エラー'9':
インデックスが有効範囲にありません。

動的配列を扱うときは、必ずReDim Preserveステートメントを使いましょう。

では、動的配列について、例を上げて説明します。

1次元配列の動的配列

たとえば、「Juice」という値を配列に追加したい場合、以下の図のように箱をもう1つ用意する必要があります。

f:id:lbibouroku:20210821101813p:plain

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

f:id:lbibouroku:20210821105554p:plain

ローカルウィンドウで結果を見ると、「drinks(3)」 に「Juice」が入っていますね。配列の要素数を増やすことに成功しました。

2次元配列の動的配列

基本的には1次元配列の動的配列と同じです。 ReDim Preserveステートメントを使って配列の要素数を変更します。 ただし、ReDim Preserveステートメントを使って変更できるのは「配列の最後の次元のみ」ということに注意が必要です。

2次元配列の動的配列の場合は、1次元配列の注意点に加えて以下を注意してください。

  • 配列の要素数を変更できるのは2次元目のみ

では、「Orange Juice」と「Apple Juice」という値を配列に追加します。

f:id:lbibouroku:20210821101840p:plain

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

f:id:lbibouroku:20210821110836p:plain

こちらもローカルウィンドウで結果を見ると、意図したとおりに配列に要素が追加できました。

さて・・・ここで気になるのは、「2次元配列で1次元目の要素数を変えたいときはどうするのか」ということですよね。

実は、もう1つ配列を作って処理を行う必要があります。 ここもExcel VBAの配列がわかりにくい要素の1つです。

少しお話すると、TRANSPOSE関数を使って配列の次元を交換します。詳しくは、「セルを使った2次元配列の動的配列のコードの書き方」を説明する際に書きますので、しばらくお待ちください。

さいごに

配列の種類の説明はここで終わりです。動的配列を宣言するときにひと手間あるので注意が必要ですね。

次回以降からはExcelファイルのセルを使ったコードの書き方を説明します。