VBAの配列とは
<< 変数の適用範囲(スコープ) :前の記事
前回は、変数の有効範囲と有効期間について解説しました。変数を宣言する場所によって、値が変化するのを確認できたかと思います。ここまで変数には1つの値を代入してきましたが、変数には複数の値を代入することもできます。その際に利用されるのが配列です。今回は、この配列について解説していきます。
目次
配列とは
配列とは、同じデータ型のデータを配列として1つにまとめた変数のことを言います。配列には、配列内で何番目のデータかを特定できるように番号が振り当てられます。この番号のことを「インデックス番号」と言います。
配列を構成する1つ1つの変数は一般的に「要素」と呼ばれており、大量のデータを扱う場合や、複数データを利用したい場合などで配列を利用すると非常に便利です。
配列の宣言
配列を利用するには決まった書式に則って記述します。配列の場合は、変数宣言と同じように宣言しますが、配列名の後に「()」(カッコ)を記述し、その中に配列の範囲を記述します。
「()」内の記述はいくつか方法がありますので、プログラミングの内容に合わせた宣言方法を利用しましょう。また、宣言した時点で指定された領域分のメモリを確保します。
配列名(インデックス番号の最大値) As データ型
インデックス番号は通常「0」から始まりますので、要素数はインデックス番号の最大値に1を足した数になります。以下の事例で言えば、インデックス番号の最大値が「4」ですので、要素数は「5」となります。また、配列のカッコ内のインデックス番号を「添え字」と言いますが本サイトでは、インデックス番号で統一することにします。
Sub Sample()
Dim a(4) As Integer
End Sub
配列名(インデックス番号の最小値 To インデックス番号の最大値) As データ型
こちらは、インデックス番号の範囲を自由に設定できる宣言になります。範囲の設定にはToを利用して最小値と最大値を記述します。以下の事例では、インデックス番号1~4までの要素数「4」の配列を宣言しています。
Sub Sample()
Dim a(1 To 4) As Integer
End Sub
配列の要素に代入
配列の要素に値を代入するには決まった書式に則って記述します。配列の場合は、変数宣言と同じように代入演算子の「=(イコール)」を記述し数値・文字列などの設定値を代入しますが、要素名の後に「()」(カッコ)を記述し、その中に配列のインデックス番号を記述します。
要素名(インデックス番号) = 数値・文字列など
こちらでは、要素数5の配列aにそれぞれ値を代入しています。
Sub Sample()
Dim a(4) As Integer
a(0) = 5
a(1) = 10
a(2) = 15
a(3) = 20
a(4) = 25
End Sub
こちらは、インデックス番号の範囲を指定した配列になりますが、実行すると実行時エラー「実行時エラー'9';インデックスが有効範囲にありません。」が表示されます。
原因としては、インデックス番号の範囲が1~4に対してインデックス番号「0」を設定しているためです。インデックス番号「0」は有効範囲外の番号ですので、エラーが表示されました。
Sub Sample()
Dim a(1 To 4) As Integer
a(0) = 5
a(1) = 10
a(2) = 15
a(3) = 20
a(4) = 25
End Sub
多次元配列とは
これまでの解説した配列はインデックスが1つでデータが1列に並んだ状態の「一次元配列」です。配列には複数列データを扱う「多次元配列」というものもあります。イメージとしては、各要素がワークシートのように縦横に並んでいる状態です。
データが2列あるものは二次元配列、3列あるものは三次元配列となり複数列データの総称を「多次元配列」と言います。ただし、次元数は無限に設定できるわけではなく、最大60まで設定が可能ですので、こちらも覚えておきましょう。
多次元配列の宣言
多次元配列を利用するには決まった書式に則って記述します。一次元配列と同じように宣言しますが、「()」内に「縦のインデックス番号の最大値,横のインデックス番号の最大値」を記述します。
配列名(縦のインデックス番号の最大値,横のインデックス番号の最大値) As データ型
こちらは、縦3×横4の二次元配列の事例になります。
Sub sample()
Dim a(2, 3) As Integer
a(0, 0) = 1
a(0, 1) = 2
a(0, 2) = 3
a(0, 3) = 4
a(1, 0) = 5
a(1, 1) = 6
a(1, 2) = 7
a(1, 3) = 8
a(2, 0) = 9
a(2, 1) = 10
a(2, 2) = 11
a(2, 3) = 12
End Sub
テーブルで表すと以下のようなイメージになります。
a(0, 0) | a(0, 1) | a(0, 2) | a(0, 3) |
a(1, 0) | a(1, 1) | a(1, 2) | a(1, 3) |
a(2, 0) | a(2, 1) | a(2, 2) | a(2, 3) |
ここまでの配列は、あらかじめ要素数が決まっている場合の宣言と代入方法になります。このようにあらかじめ要素数が決まっている配列のことを「静的配列」と呼びます。
簡易的なプログラムであれば静的配列で対応することができますが、複雑なプログラムになれば、要素数が決まっていないことが多々あります。そのような場合に利用されるのが「動的配列」と呼ばれるものです。こちらについても説明していきます。
動的配列とは
動的配列とは、データ型宣言時に要素数を決めずに実行時に要素数を変更させる配列のことを言います。配列に格納する要素数が分からない場合は、動的配列を利用します。尚、動的配列ではデータが格納されている分しかメモリを使用しないので、メモリの無駄が生じません。
動的配列の宣言
動的配列を利用する場合は、データ型宣言時に要素数を設定せず宣言します。
配列名() As データ型
実行時に動的配列を利用する状況になった場合は、動的配列の次元数や要素数を変更するReDimステートメントを利用して「()」内にインデックス番号の最大値を記述します。
ReDim 配列名(インデックス番号の最大値)
こちらでは、動的配列の事例で配列a(0)に「5」、配列a(1)に「10」、配列a(2)に「15」を代入しています。
Sub Sample()
Dim a() As Integer
ReDim a(2)
a(0) = 5
a(1) = 10
a(2) = 15
End Sub
ReDimステートメントは次元数や要素数を変更できますが、一度設定したデータ型を変更することはできません。また、すでに値が格納されている動的配列を再度変更する場合は、最設定の時点ですべての値が破棄されます。
理由としては、要素数の変更と共にメモリ上のまったく新しい領域に、配列変数の格納領域が再度割り当てられるためです。配列の値を保持した状態で要素数を変更したい場合は、Preserveキーワードを利用します。
Preserveキーワードを利用すれば、既存の配列から新しい配列に要素がコピーされるようになります。ただし、Preserveキーワードで変更ができるのが、配列の最後の次元の要素数だけなので、ご注意ください。
ReDim Preserve 配列名(インデックス番号の最大値)
こちらでは、要素数の変更と配列の値の状態をチェックするマクロになります。Preserveキーワードを使用して変更した動的配列は値が保持され、通常の変更をした場合はすべての値が破棄されているのが分かるかと思います。
Sub Sample()
Dim a() As Integer
ReDim a(1, 1)
a(0, 0) = 1
a(0, 1) = 2
a(1, 0) = 3
a(1, 1) = 4
ReDim Preserve a(1, 2)
MsgBox "配列a(0, 0)の値:" & a(0, 0) & vbCrLf & _
"配列a(0, 1)の値:" & a(0, 1) & vbCrLf & _
"配列a(1, 0)の値:" & a(1, 0) & vbCrLf & _
"配列a(1, 1)の値:" & a(1, 1)
ReDim a(2, 3)
MsgBox "配列a(0, 0)の値:" & a(0, 0) & vbCrLf & _
"配列a(0, 1)の値:" & a(0, 1) & vbCrLf & _
"配列a(1, 0)の値:" & a(1, 0) & vbCrLf & _
"配列a(1, 1)の値:" & a(1, 1)
End Sub
インデックス番号の最小値を変更
インデックス番号の最小値の規定値は「0」ですが、場合によっては最小値を変更したい場合もあります。そのような場合は、Option Baseステートメントを利用して、「1」から始めるように変更することができます。利用する場合は、宣言セクション内に以下のように記述します。
Option Base 1
以下の事例はOption Baseステートメントに「1」を設定したものです。これによりインデックス番号の最小値が「1」に設定されたので、インデックス番号「0」に格納すると実行時エラー「実行時エラー'9';インデックスが有効範囲にありません。」とエラーが表示されます。
Option Base 1
Sub sample()
Dim x(2) As Integer
x(0) = 1 'エラーが起きる
x(1) = 2
x(2) = 3
End Sub
VBA関数を利用した配列
ここまで変数に格納する方法で解説しましたが、VBA関数の中には配列を返す関数もあります。こちらでは、そのVBA関数について解説します。
Array関数
こちらは、Array関数を利用した配列になります。Array関数を利用する場合は、必ずデータ型をバリアント型(Variant)で指定する必要があります。
Sub Sample()
Dim a As Variant
a = Array("Excel", "VBA", "入門")
MsgBox "配列a(0)の値:" & a(0) & vbCrLf & _
"配列a(1)の値:" & a(1) & vbCrLf & _
"配列a(2)の値:" & a(2)
End Sub
Split関数
こちらは、Split関数を利用した配列になります。Split関数の区切り文字は「:(コンロ)」を設定しています。
Sub Sample()
Dim a As Variant
a = Split("Excel:VBA:入門", ":")
MsgBox "配列a(0)の値:" & a(0) & vbCrLf & _
"配列a(1)の値:" & a(1) & vbCrLf & _
"配列a(2)の値:" & a(2)
End Sub
まとめ
今回は、配列について解説しました。配列には静的配列と動的配列がありますが、どちらも非常に使用頻度が高いものです。動的配列をうまく利用することができれば、複雑なプログラミングもできますしコードも簡素化できる場合もあります。ここまで値を変化できる変数や配列を解説しましたが、次回は値を固定する定数について解説します。
次の記事: VBAの定数とは >>
近田 伸矢, 植木 悠二, 上田 寛
IEのデータ収集&自動操作のプログラミング本はこの1冊だけ!IEの起動やポップアップウィンドウ、表示を制御する基本的なコードはもちろん、テキストボックスやラジオボタン、表、ハイパーリンクなどのHTML部品を制御する方法など、自動操作に欠かせないノウハウを丁寧に解説。