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

VBA 配列

はじめに

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

静的配列は宣言時に要素数を決定します。動的配列は宣言後に要素数を変更できます。

配列のすべての要素を取得または設定するには For 文などのループ処理を使います。

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

配列を宣言する

配列とは複数の同じ型の変数をまとめたものです。要素が列のようになっています。各要素はインデックス (番号) で指定します。

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 になっている

配列を操作する

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

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

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


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

配列に配列を代入する

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


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

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

' 型が一致していない
Dim 不一致(3) As Integer
動的 = 不一致 ' エラー、型が一致していない
静的 = 不一致 ' エラー、型が一致していない

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

関数の引数に配列を渡す

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


Sub 実行()
    Dim 配列 As Integer ' 引数と同じ型
    Call Tips(配列)
End Sub

Sub Tips(引数() As Integer) ' 渡される配列と同じ型

End Sub

配列の全要素を参照する

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


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
Next

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


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

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

二次元配列

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

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