VBA 配列を宣言する

はじめに

Excel VBA マクロで配列の宣言や代入する方法を紹介します。

配列とは、複数の値をまとめたものです。要素が列のようになっています。

1

Dim 変数名(要素数) As 型名 のようにして、静的配列を宣言できます。

Dim 変数名() As 型名 のようにして、動的配列を宣言できます。

Public 変数で配列を宣言するには、標準モジュールにする必要があります。

配列の変数に配列を代入するには、動的配列の変数に同じ型の配列だけ代入できます。

配列(0) = 1 のようにインデックスを使用して、配列の要素を取得または代入できます。

  • 目次
    • 配列を宣言する
    • 変数に配列を代入する
    • 配列の要素を取得または代入する
    • 二次元配列

配列を宣言する

配列には要素数が固定の「静的配列」と変更可能な「動的配列」があります。

静的配列

Dim 変数名(要素数) As 型名 のように入力します。変数を宣言するときの変数名に () を付けると配列になり、要素数も入力すると「静的配列」になります。

() の中に要素数を指定します。3 を指定すると 0 ~ 3 の 4 つの要素を持つ配列が作成されます。

1
' 静的(0 ~ 3) の 4 つの要素を持つ配列
Dim 静的(3) As Integer

' このように何個も同じ変数を作る必要がなくなる
Dim 数値0 As Integer
Dim 数値1 As Integer
Dim 数値2 As Integer
Dim 数値3 As Integer

Dim 変数名(最小 To 最大) As 型名 のように、要素の最小インデックスと最大インデックスを指定して宣言できます。

1 To 3 を指定すると 1 ~ 3 の 3 つの要素を持つ配列が作成されます。

2
' 静的(1 ~ 3) の 3 つの要素を持つ配列
Dim 静的(1 To 3) As Integer

宣言するときに要素数を決め、その後は要素数を変更できません。このため「静的」配列と言います。

動的配列

少し複雑なので最初は静的配列で慣れてから使ったほうが理解しやすいです。

Dim 変数名() As 型名 のように入力します。宣言時に要素数を省略すると「動的配列」になります。

宣言しただけでは要素を 1 つも持っていない空の配列です。

ReDim 変数名(要素数) で動的配列の要素数を決定します。何度でも要素数を変更できます。

' 要素は 1 つもない動的配列
Dim 動的() As Integer

' 要素数を変更する
ReDim 動的(3)      ' 0 ~ 3、Dim 配列(3) と同じ要素数になる
ReDim 動的(4)      ' 0 ~ 4、Dim 配列(4) と同じ要素数になる
ReDim 動的(1 To 3) ' 1 ~ 3、Dim 配列(1 To 3) と同じ要素数になる

ReDim Preserve 変数名(要素数) のように Preserve を付けても要素数を変更できます。

Dim 動的() As Integer

ReDim Preserve 動的(3)
ReDim Preserve 動的(4)
ReDim Preserve 動的(1 To 3)

ReDim で要素数を変更すると、配列に入っていた値はすべて初期化されます。数値型なら 0 になります。Preserve を付けると値が保持されたまま変更できます。

Preserve を付けると配列の最小インデックスが異なるときにエラーになります。

Dim 動的() As Integer

ReDim 動的(3)      ' 0 ~
ReDim 動的(1 To 3) ' 1 ~、最小インデックスが 0 から 1 になっても変更できる
Dim 動的() As Integer

ReDim Preserve 動的(3)      ' 0 ~
ReDim Preserve 動的(1 To 3) ' 1 ~、エラー、最小インデックスが 0 から 1 になっている

配列のスコープ

Public で宣言するには、標準モジュールにする必要があります。Sheet1 やクラスには宣言できません。

それ以外は通常の変数と同じです。

Public パブリック() As Integer ' Public は標準モジュールにのみ宣言できる

Private プライベート() As Integer

Sub 実行()
    Dim ローカル() As Integer
End Sub
詳しくは「スコープ」をご覧ください。

変数に配列を代入する

配列の変数に配列を代入するには次の条件があります。要素数は関係ありません。

  • 動的配列の変数に代入する:静的配列の変数には代入できません。代入する配列は動的でも静的でもできます。
  • 型が一致している:変数と代入する配列の型が同じ必要があります。Long から Integer など通常の変数では代入できる型でも配列ではできません。

つまり、動的配列に同じ型の配列だけ代入できます。

Dim 動的() As Long
Dim 静的(3) As Long

' 型が一致している
Dim 型一致(4) As Long
動的 = 型一致 ' OK
静的 = 型一致 ' エラー、静的配列には代入できない

' 型が一致していない
Dim 型不一致(3) As Integer
動的 = 型不一致 ' エラー、型が一致していない
静的 = 型不一致 ' エラー、静的配列には代入できない、型が一致していない

静的配列を代入しても、配列の変数は動的配列のままです。要素数と値が代入した配列と同じになります。簡単に言うとコピーが作成されます。

関数の引数に配列を渡す

関数の引数が配列のときも、上記と同じ条件が当てはまります。

Sub 実行()
    Dim 動的()  As Integer ' 引数と同じ型
    Dim 静的(3) As Integer ' 引数と同じ型
    Call サブ(動的)
    Call サブ(静的)
End Sub

Sub サブ(引数() As Integer) ' 引数は動的配列で渡される配列と同じ型

End Sub

配列の要素を取得または代入する

配列の要素の値を取得または代入する方法を紹介します。

配列の要素を指定するにはインデックス (番号) を使います。

配列(インデックス) で指定したインデックスの要素に対して、値を取得したり代入したりできます。

' 配列(0 ~ 3) の 4 つの要素を持つ
Dim 配列(3) As Integer

' 配列に値を代入
配列(0) = 0  ' インデックス 0 番目の要素に 0 を代入する
配列(1) = 10 ' インデックス 1 番目の要素に 10 を代入する
配列(2) = 20 ' インデックス 2 番目の要素に 20 を代入する
配列(3) = 30 ' インデックス 3 番目の要素に 30 を代入する

' 配列の値を取得
Dim i As Integer
i = 配列(1) ' インデックス 1 番目の要素を取得する
Debug.Print(i) ' 10
i = 配列(2) ' インデックス 2 番目の要素を取得する
Debug.Print(i) ' 20

インデックスで要素を指定する以外は、通常の変数と全く同じです。

デバッグの仕方」で紹介しているウォッチウィンドウに配列の変数を設定したり、ローカルウィンドウを見ると、わかりやすいと思います。

3

範囲外のインデックスを指定したときは「エラー 9 インデックスが有効範囲にありません。」が発生します。

初期化

Array 関数」を使用して簡単に配列を初期化できます。Variant 型の配列が作成されるので受け取る変数も Variant 型にする必要があります。

Dim 配列() As Variant ' Variant 型の動的配列
配列 = Array(1, 2, 3) ' (0 ~ 2) の Variant 型の配列を作成
Debug.Print(配列(0)) ' 1
Debug.Print(配列(1)) ' 2
Debug.Print(配列(2)) ' 3

[{値1, 値2, …}] のように [] で囲ってエクセルに配列を入力するのと同じように代入できます。ただし最小インデックスが 1 になります。

Dim 配列() As Variant ' Variant 型の動的配列
配列 = [{1, 2, 3}] ' (1 ~ 3) の Variant 型の配列を作成
Debug.Print(配列(1)) ' 1
Debug.Print(配列(2)) ' 2
Debug.Print(配列(3)) ' 3

静的配列や Variant 型以外の配列を初期化するには、次のようにループします。

ループして取得または代入

配列を初期化するときなど、全要素をループするには、次の関数を使用してインデックスの最小値と最大値を取得できます。それを使用して要素数を取得できます。

  • LBound 関数:配列の最小インデックスを取得します。
  • UBound 関数:配列の最大インデックスを取得します。
Dim 配列(3) As Integer
Dim min As Integer
min = LBound(配列) ' 0、配列の最小インデックスを取得する
Dim max As Integer
max = UBound(配列) ' 3、配列の最大インデックスを取得する

' 全要素をループして取得または代入
Dim i As Integer
For i = min To max ' i の値が 0 ~ 3 まで変化する    
    配列(i) = 10
    Debug.Print(配列(i)) ' 10
Next

UBound - LBound + 1 で配列の長さ (要素数) を取得できます。

Dim 要素数 As Integer
要素数 = UBound(配列) - LBound(配列) + 1 ' 要素数を取得する

この他にも配列に関する関数があります。

詳しくは「関数一覧」の「配列」をご覧ください。

二次元配列

このページで紹介した配列は一次元配列です。この他に二次元配列や三次元配列など、配列の次元数を増やせます。

詳しくは「二次元配列」をご覧ください。