VBA 二次元配列を宣言する

はじめに

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

Dim 配列(一次元の要素数, 二次元の要素数) As 型名 のようにして、二次元配列を宣言できます。

ReDim 変数名(一次元の要素数, 二次元の要素数) のようにして、動的配列を二次元配列にできます。

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

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

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

二次元配列を宣言する

配列」で紹介しているのは一次元配列です。次元数を増やして二次元や三次元配列を作成できます。

Dim 配列(一次元の要素数, 二次元の要素数) As 型名 のように入力します。要素数を , で区切って次元数を増やせます。

Dim 一次元(3) As Integer

Dim 二次元(3, 4) As Integer
Dim 二次元2(1 To 3, 2 To 4) As Integer ' To も使える

Dim 三次元(3, 4, 5) As Integer

一次元配列のイメージ

Dim 静的(3) As Integer

一次元配列は、要素が横一列の「列」になっています。

3

二次元配列のイメージ

Dim 静的(2, 3) As Integer

二次元配列は、要素が「表」になっています。一次元目が縦方向の「行」を表し、二次元目が横方向の「列」を表します。

4
一次元目の配列の要素に二次元目の配列がそれぞれ入っているイメージです。
Dim 静的1(一次元, 二次元) As Integer
Dim 静的2(行, 列) As Integer
Dim 静的3(縦, 横) As Integer

三次元配列のイメージ

三次元配列以降でも考え方は同じです。

三次元配列は二次元配列の「表」が複数あるイメージです。四次元配列は三次元配列が複数あるイメージです。次元数が増えると、上位の次元の中に下位の次元の配列が入っているように増えていきます。

一般的には二次元配列まで使用します。三次元以降は使われません。

動的配列

ReDim 変数名(一次元の要素数, 二次元の要素数) または ReDim Preserve 変数名(一次元の要素数, 二次元の要素数) で動的配列の要素数を二次元配列に変更できます。

Dim 動的() As String ' 動的配列

ReDim 動的(2, 3)          ' Dim 配列(2, 3) と同じ要素数になる
ReDim Preserve 動的(2, 3) ' Dim 配列(2, 3) と同じ要素数になる

ReDim なら次元数の変更もできます。

Dim 動的() As String ' 動的配列

ReDim 動的(2, 3)    ' 二次元配列
ReDim 動的(2, 3, 4) ' 三次元配列

ただし Preserve を付けて変更するには、次の条件があります。

  • 1. 最後より前の次元のインデックスが同じ:二次元配列なら一次元目のインデックスは変更できません。
  • 2. 最後の次元の最小インデックスが同じ:一次元配列のときと同じ条件です。

つまり、最後の次元の要素数だけ変更できます。

Dim 動的() As Integer

ReDim 動的(2, 3)    
ReDim 動的(3, 1 To 2) ' Preserve が付いていないときは自由に変更できる
Dim 動的() As Integer

ReDim Preserve 動的(2, 3)      ' 最初の ReDim は自由に変更できる
ReDim Preserve 動的(3, 3)      ' 1. の条件でエラー
ReDim Preserve 動的(1 To 3, 3) ' 1. の条件でエラー
ReDim Preserve 動的(2, 1 To 3) ' 2. の条件でエラー
ReDim Preserve 動的(2, 4)      ' OK

Preserve で一次元配列を二次元配列にするなど、次元数を変更できません。

変数に二次元配列を代入する

一次元配列と条件は同じです。

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

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

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

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

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

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

二次元配列の値を取得または代入する方法は一次元配列と同じです。次元数を指定するインデックスを間違えないように注意します。次の値を持った二次元配列を作成します。

5
' 二次元配列(0 ~ 2, 0 ~ 3) の要素を持つ
Dim 二次元(2, 3) As String

' 配列の縦方向に値を代入
二次元(0, 0) = "A1"
二次元(1, 0) = "A2"
二次元(2, 0) = "A3"
' 配列の横方向に値を代入
二次元(0, 0) = "A1"
二次元(0, 1) = "B1"
二次元(0, 2) = "C1"
二次元(0, 3) = "D1"

' 配列の値を取得
Dim i As Integer
i = 二次元(0, 0)
Debug.Print(i) ' A1
i = 二次元(1, 0)
Debug.Print(i) ' A2
i = 二次元(0, 1)
Debug.Print(i) ' B1
i = 二次元(1, 1)
Debug.Print(i) ' B2

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

初期化

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

[{値1, 値2; 値3, 値4; …}] のように ; で区切ると一次元目の要素が増えていきます。Variant 型の配列が作成されるので受け取る変数も Variant 型にする必要があります。

Dim 配列() As Variant ' Variant 型の動的配列
配列 = [{"A1", "B1", "C1"; "A2", "B2", "C2"}] ' (1 ~ 2, 1 ~ 3) の Variant 型の配列を作成
Debug.Print(配列(1, 1)) ' A1
Debug.Print(配列(1, 2)) ' B1
Debug.Print(配列(1, 3)) ' C1
Debug.Print(配列(2, 1)) ' A2
Debug.Print(配列(2, 2)) ' B2
Debug.Print(配列(2, 3)) ' C2

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

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

一次元配列と同じように「LBound 関数」と「UBound 関数」で最小と最大のインデックスを取得できます。第 2 引数に取得したい次元数を指定します。

Dim 二次元(1 To 3, 2 To 4) As Integer

' 一次元目の要素数を取得
Dim min1 As Integer
Dim max1 As Integer
min1 = LBound(二次元, 1) ' 1、一次元の最小インデックス
max1 = UBound(二次元, 1) ' 3、一次元の最大インデックス

' 二次元目の要素数を取得
Dim min2 As Integer
Dim max2 As Integer
min2 = LBound(二次元, 2) ' 2、二次元の最小インデックス
max2 = UBound(二次元, 2) ' 4、二次元の最大インデックス

' 全要素をループする
Dim i As Integer
Dim j As Integer
For i = min1 To max1
    For j = min2 To max2
        二次元(i, j) = 10
        Debug.Print(二次元(i, j)) ' 10
    Next
Next

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

Dim 要素数1 As Integer
Dim 要素数2 As Integer
要素数1 = UBound(二次元, 1) - LBound(二次元, 1) + 1 ' 一次元の要素数を取得する
要素数2 = UBound(二次元, 2) - LBound(二次元, 2) + 1 ' 二次元の要素数を取得する
Debug.Print(要素数1 * 要素数2) ' 全要素数