VBA配列とは、配列変数 静的配列 動的配列 マクロ講座

VBA配列とは、配列変数 静的配列 動的配列 マクロ講座

VBA配列とは
通常の変数と配列変数

マクロ 80回

配列を理解する

配列については、動画等で数々の例を取り上げていますが、記事も大変だいぶ増えたので、ここで少しおさらいをしたいと思います。

配列というのは、複数の値をまとめて扱うことができる特殊なデータ構造のことです。 単に、配列というときは通常、 配列変数を意味します。

マクロで使うときは、変数と同様に、ユーザーが任意の文字列を配列として使用できます。 単なる変数か、それとも配列変数かの区別は、かっこがあるかないかです。配列変数名の後に括弧をつけることで、それが配列であるという意味になります。

(サンプルファイルは、こちらから マクロ80回サンプルZIP

配列の種類

1. 配列には、2種類あります。 1つは、固定長配列(静的配列)、もう1つは動的配列です。

固定長配列というのは、配列のサイズ、つまり、要素の数が、決まっているものです。データ数が固定されているものということになります。

一方、動的配列というのは、コードの中で、サイズ、つまり要素の数を、変化させることができるものです。


配列をコピーする1

2. はじめに固定長配列から。 見て行きましょう。 固定長配列を宣言するには、配列の使用を始める前に変数と同じく、Dimステートメントで宣言します。 このように宣言すると hako という整数型の固定長配列が使用できるようになります。
Dim hako(3) As Integer


配列をコピーする2

3. 括弧の中の数字は配列の要素の数です。 (インデックス番号の最大値)を入れる。
インデックス番号は通常は0から数え始めるので、hakoという配列は合計4つの要素を持っていることになります。 つまり配列の宣言時に要素の数を指定すると、自動的に固定長配列となります。 Dim 変数名(上限値) As データ型


4. インデックス番号に関しては、最小値は0ではなく1の方が分かりやすいという方も多いでしょう。
そのような場合にはOption Base ステートメントでモジュール単位でインデックス番号の最小値を変更することができます。
規定のベースは0なので、最小値が0で良い場合は、Option Base ステートメントが必要になることはありません。最小値を1にしたい時にだけ使います。
Option Base は、モジュール内で 1 回だけ使用できます。


配列をコピーする4

Option Base 1 と指定しても、それでも、ParamArray (または、VBA.Array のようにタイプ ライブラリの名前で修飾されているときの Array 関数) には影響しません。

Toキーワード

5. Toキーワードを使ってインデックス番号の最小値と最大値を指定することができます。 たとえ、Option Base 1 を宣言しても、Toキーワードを使うと、影響されなません。
下図のコードでは、MyArrayには、1から20まで、20個のデータが入っており、ZeroArrayには、0から5まで6個のデータが入っています。


配列をコピーする5

動的配列を宣言するには

6. 動的配列とは宣言した時点で要素の数を特定せず、コードの実行中に変化させることができる配列のことです。
このような配列を作成するにはDimステートメントで括弧の中には何も入れずに配列を宣言します。
Dim 動的配列() As Variant
動的配列という変数には、Variant型のデータが入ります。上限値は入れません。
要素数が確定したら、ReDimステートメントを利用して、配列変数に上限値を設定します。
ReDim 変数名(上限値)

シートから配列のデータを代入する

7. 固定長配列の場合 シートにあるデータを配列として使います

Sub 配列コピー()
    Dim hako(4) As Variant
        hako(0) = Range("A1")
        hako(1) = Range("A2")
        hako(2) = Range("A3")
        hako(3) = Range("A4")
        hako(4) = Range("A5")
    MsgBox "5番目の要素は" & hako(4) & "です"
End Sub

配列をコピーする7

8. 動的配列の場合
では動的配列にもシートからA列の値を代入してみましょう。 サンプルの例では、データの1行目に見出しがありませんので、そのまま行数として使います。もし見出しがある場合は行数は-1してください。

Sub 動的配列コピー()
    Dim hako() As Variant
    Dim 行数 As Long
    Dim i As Long
    行数 = Cells(Rows.Count, 1).End(xlUp).Row
    ReDim hako(行数 - 1)
        For i = 0 To 行数 - 1
            hako(i) = Cells(i + 1, 1)
        Next i
    MsgBox 行数 & "の要素は" & hako(行数 - 1) & "です"
End Sub

配列をコピーする8

9. ステップ実行で1行ずつコードを実行すると、For文の変数iが変わるごとに、配列にデータが代入されるのを確認することができます。


配列をコピーする9

10. そして、最後にメッセージでhako(行数 - 1)の中身を表示します。


配列をコピーする10