Excel VBAの静的配列と動的配列の宣言:Dim, Redim, Redim Preserve

VBA の配列には「静的配列」と「動的配列」の2種類の配列が存在します。

静的配列は要素数が決まっている場合に使う配列です。一方、動的配列は要素数が決まっていない場合に使う配列です。用途に合わせてこれらの配列を使い分ける必要があります。

ここでは、それぞれの配列の宣言方法と使い方について説明します。

静的配列の宣言

静的配列の宣言する構文は以下の通りです。

Dim 配列名(最大インデックス番号) As 型名

括弧 () には配列の最大インデックス番号を指定します。たとえば2を指定した場合は、配列のインデックスは0から始まるので、要素数は3になります。また、As の後には配列の型を指定します。As は省略可能ですが、省略した場合はバリアント型になります。

以下は、要素数が3の Integer 型の配列 A を宣言した例です。

Dim A(2) As Integer
A(0) = 1
A(1) = 2
A(2) = 3
MsgBox Join(A) ' Joinは配列を結合して文字列を返す関数です

上のプログラムの場合、要素数は3なので、 A(3) にアクセスするとエラーになります。

また、対応していない型の要素を代入しようとするとエラーになるので注意が必要です。ただし、文字列型の配列の場合は、数値も代入することができます。その場合、数値は自動的に文字列型に変換されます。

インデックス番号の最小値を設定する:To

以下のように To を用いればインデックス番号の最小値を設定することもできます。

Dim A(1 To 2) As Integer
A(1) = 2
A(2) = 3
MsgBox Join(A)

この場合、要素数は2でインデックス番号の最小値は1、最大値は2になります。そのため、A(0) にアクセスしようとするとエラーになります。

To を用いることで配列のインデックス番号と Excel の行番号などの対応が直感的にわかりやすくなります。

動的配列の宣言

動的配列の宣言する構文は以下の通りです。

Dim 配列名() As 型名

静的配列と違い括弧()には何も指定しません。型の扱いについては静的配列と同じです。

以下は、文字列型の動的配列を宣言する例です。

Dim A() As String

動的配列は宣言しただけだと要素数は0であるから、このままでは要素を格納することはできません。

Dim A() As String
A(0) = "山田"

上のプログラムを実行すると、「インデックスが有効範囲にありません。」というエラーになります。

動的配列は基本的に必要に応じて格納できる要素数を変更しながら使う必要があります。

動的配列の要素数を変更する:Redim

Redim は動的配列の要素数を変更する構文です。

Redim 配列名(最大インデックス数)

Redim は同じ配列に何度も適用することができます。

以下は、動的配列の要素数を2に設定した例です。

Dim A() As String
ReDim A(2)
A(0) = "山田"
A(1) = "鈴木"
A(2) = "佐藤"
MsgBox Join(A)

このように動的配列は Redim で要素の入れ物を確保をしながら使用します。

以下は、複数回 Redim を使用した例です。

Dim A() As String
ReDim A(2)
A(0) = "山田"
A(1) = "鈴木"
A(2) = "佐藤"

ReDim A(3)
A(3) = "木村"
MsgBox Join(A)

このプログラムのメッセージボックスの表示を確認すると「木村」としか表示がされません。これは ReDim を使用した場合、一度すべての配列のデータが削除されてしまうからです。格納したデータを残したまま配列の要素数を変更する場合には、Preserve を指定する必要があります。

データを残して要素数を変更する:Redim Preserve

Redim Preserve の構文は以下の通りです。

ReDim Preserve 配列名(最大インデックス番号)

以下は、Redim Preserve を使用した例です。

Dim A() As String
ReDim A(2)
A(0) = "山田"
A(1) = "鈴木"
A(2) = "佐藤"

ReDim Preserve A(3)
A(3) = "木村"
MsgBox Join(A)

上のプログラムを実行すると「山田 鈴木 佐藤 木村」とメッセージボックスに表示されます。このように Redim Preserve を使用することで、データを残したまま要素数を変更することができます。


イベント

2017/12/05(火)
Design Thinking Square