VBAの配列を理解しよう!
VBAの配列を理解しよう!
配列とは?
VBAに限らず、配列はプログラミングにおいて重要な要素となります。まずは、配列について理解していきましょう。
プログラムにおける「配列」とは、情報を記憶しておくための箱である変数の一つで、複数の箱が連なっているものとイメージしてください。変数は、通常一つの値しか扱いませんが、「配列」では一つの変数の中で複数の値を扱うことができるのです。もう少し簡単に言うと、変数を幾つか繋げた箱のセットが「配列」なのです。変数の値はインデックスという箱の番号によって管理され、それぞれのインデックスに対応させた値を入れることができます。「配列」は基本的に0から始まります。
変数は通常、一つの箱に一つの値しか入れることができません。
配列なれば、複数の箱をセットとして扱うことができます。箱には「0」から番号が付けられており、対応した値を入れることができます。
配列の書式
通常の変数を宣言する場合には
Dim 変数名
ですが、配列の場合には
Dim 配列名([下限] to [上限])
というように、変数宣言に続いて「(…to…)」という形で指定をします。
Dim Number(1 to 4)
と記述すると
Number(1)
Number(2)
Number(3)
Number(4)
の4つの変数、つまり箱が4つ分一気に確保できたことになります。先ほど、変数は「0」から始まると説明しましたが、VBAでは後述するセル範囲を指定する場合の二次元配列では自動的に「1」から始まるので、下限を「1」に設定するほうが都合がいい場合が多いです。
下限を設定しない場合
Dim Number(4)
このように、変数宣言をする際に、下限の入力を省略することもできます。この場合には、VBAのモジュール、つまりプログラムの冒頭の設定である「Option Base」分の指定に応じて、下限(配列の始まり)は「0」または「1」に自動的に決定します。指定がない場合は下限は自動的に「0」となります。なので、上記のコードでは、Number(0),Number(1),Number(2),Number(3),Number(4)の5つ分の箱が用意されるのです。
2次元配列
配列では変数のかっこ()の中の数字を添え字と言いますが、今まで紹介していきたものには、Number(1)のように添え字を一つしか使用していません。今回紹介する2次元配列では、添え字を2つ使うことができます。
2次元配列では以下のような書式になっています。
Dim 配列名([下限1] to [上限1], [下限2] to [上限2])
例えば以下のように変数を宣言すると…
Dim Number(1 to 3, 1to 2)
Dim Number(1, 1)
Dim Number(1, 2)
Dim Number(2, 1)
Dim Number(2, 2)
Dim Number(3, 1)
Dim Number(3, 2)
という6つの変数を用意することができます。この変数のかっこの中身はどこかで見たことがないでしょうか。そうです。セルの表記方法と一緒ですね。2次元配列を用いるとセル範囲の値をそのまま配列に格納したり、配列で指定した値を指定したセルの範囲に反映させることができ、VBAを活用する上で非常に便利です。
配列の利用方法
これまで配列の概要について説明をしてきました。配列というものが何なのか、何となくイメージができてきたのではないでしょうか。では実際に配列はVBAのプログラムとしてどのように利用すればよいのでしょうか。以下に紹介していきます。
セルの範囲をコピーする
入力された値を、違うセルにそのまま参照したい場合に手作業では非常に面倒で、非効率的です。セルに関数を入れても良いですが、数が多くなるとそれも面倒です。しかも、セルの中には関数が入った状態であるので、値として扱う際には不便な点もあります。VBAなら、プログラムで処理をしてセルに反映させるので値貼りをする必要がなくなります。また、VBAならば、コードを修正しさえすれば、すぐに指定した範囲のセル全てに結果を反映することができるのです。
非常に簡単な場合ですが、一例としてこのように記述できます。
Sub セルをコピー()
Dim Number
Number = Range("A1:B4").Value
Range("C1:D4").Value = Number
End Sub
<解説>
・まず変数Numberを宣言し、Number = Range("A1:B4").Valueの行で、 A1セル~B4セルの内容をNumberにコピーしています。
※この時に、セルの範囲を指定したので自動的にDim Number(1 to 4,1 to 2)が実行された状態になります。
そしてRange("D1:E4").Value = Numberの行でC1セル~D4セルにNumberの内容をコピーすることができました。
配列とFor Next
For Next は配列と非常に相性のいい構文で、指定した回数だけループするときに使います。
For インデックス = 初期値 To 最終値のように入力した後、改行をしてからNextを入力します。そしてその間に記述した処理をループさせることができます。
基本のFor Next構文はこちらです。
For インデックス = (初期値)To (最終値)
ループさせる処理を記述
Next
配列と一緒に利用するとこのように記述することができます。
Dim Data(2) As Integer
Dim i As Integer
For i = LBound(Data) To UBound(Data)
Data(i) = i * 10
Next
For i = LBound(Data) To UBound(Data)
Debug.Print(Data(i)) ' 0 10 20
Next
<解説>
・Dim Data(2) As Integer では配列を、Dim i As IntegerではFor文で使用するインデックスを宣言しています。AS integerは整数であるという型を宣言しています。
・LBound(Data) To UBound(Data)では、LBound(Data) で配列の下限、 UBound(Data)で配列の上限を示しています。つまり、この行でFor i = 0 to 2が宣言されていることになります。
・Data(i) = i * 10 で配列の要素に値が設定できました。0から2までに順番に10を掛けた数を配列に格納しています。
・次のFor文ではDebug.Print(Data(i)) を使用しています。Debug.PrintではData(i)の数である 0 10 20をVBAのイミディエイトウィンドウに出力することができ、実行結果の確認ができます。
まとめ
いかがでしたでしょうか。配列を覚えることができると、VBAで出来ることの幅が大きく広がりますね。皆さんも色々と試してみてください。