サイトについて      連絡先   検索

VBA 二次元配列

はじめに

Excel VBA マクロで二次元配列の使い方を紹介します。

二次元配列は配列が二階層になっています。一次元を列と考えると、二次元は表です。

動的配列を Redim するには条件があります。要素数を取得する方法も紹介します。

  • 目次
    • 二次元配列を宣言する
    • 二次元配列を操作する
    • 二次元配列を代入する
    • 二次元配列の全要素を参照する

二次元配列を宣言する

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

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

次元数は配列(1次元, 2次元)のように前から数えます。


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

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

一次元配列の考え方


Dim 静的(3) As Integer

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

3

二次元配列の考え方


Dim 静的(2, 3) As Integer

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

4
ここで注意が必要なのが、一次元配列の「列」が二次元配列では二次元目であるということです。

Dim 静的1(一次元, 二次元) As Integer
Dim 静的2(行, 列) As Integer
Dim 静的3(縦, 横) As Integer

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

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

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

動的配列

ReDim 変数名(要素数1, 要素数2)またはReDim Preserve 変数名(要素数1, 要素数2)で動的配列の要素数を変更できます。一次元配列のときと同じです。


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

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

ただし Preserve を付けたときの二次元以上の配列では、次の条件があります。


Dim 動的() As Integer

ReDim 動的(2, 3)    
ReDim 動的(2, 3, 4) ' Preserve が付いていないときは何でも変更できる

Dim 動的() As Integer

ReDim Preserve 動的(2, 3)
ReDim Preserve 動的(3, 3)      ' 1. の条件のエラー
ReDim Preserve 動的(1 To 2, 3) ' 1. の条件のエラー
ReDim Preserve 動的(1, 1 To 3) ' 2. の条件のエラー
ReDim Preserve 動的(1, 4)      ' OK

二次元配列を操作する

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

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 インデックスが有効範囲にありません。」が発生します。

二次元配列を代入する

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

二次元配列の全要素を参照する

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


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

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

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

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

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


Dim 要素数1 As Integer
Dim 要素数2 As Integer
要素数1 = UBound(二次元, 1) - LBound(二次元, 1) + 1 ' 1 次元の要素数を取得する
要素数2 = UBound(二次元, 2) - LBound(二次元, 2) + 1 ' 2 次元の要素数を取得する
Debug.Print (要素数1 * 要素数2) ' 全要素数
  • 目次
    • 二次元配列を宣言する
    • 二次元配列を操作する
    • 二次元配列を代入する
    • 二次元配列の全要素を参照する