配列は変数の一種です。変数を先に覚えて下さい。
変数との違いは、同じ配列(変数)に、複数の値を格納することができることです。
たとえば、セルA1からA5まで名前が入力されているとします。
それらを変数に入れて加工したい、といったことが良くあります。
変数でやるなら変数name_01、変数name_02・・・、と、名前の数だけ変数を作ることになります。
これは不便です。
配列変数ならこうします。
Private Sub CommandButton1_Click()
Dim arrName(4)
arrName(0) = Range("A1").Value
arrName(1) = Range("A2").Value
arrName(2) = Range("A3").Value
arrName(3) = Range("A4").Value
arrName(4) = Range("A5").Value
MsgBox arrName(4)
End Sub
一行ずつ説明します。
Dim arrName(4)
配列変数の宣言です。変数と違うのは「arrName(4)」と、「(4)」がついていることです。これは”この配列には5つ”の値が格納できますよ、という意味です。4と書いたのに5つとはどういうことかというと、配列の値を指定する数字は”0”から始まるからです。
この、配列の数を指定する数値のことを「インデックス番号」といいます。また、配列に格納されている値のことを「要素」といいます。配列に格納されている値の数は「要素数」といいます。
arrName(0) = Range("A1").Value
arrName(1) = Range("A2").Value
arrName(2) = Range("A3").Value
arrName(3) = Range("A4").Value
arrName(4) = Range("A5").Value
ここで、各配列に値を代入しています。セルA1の値が配列arrName(0)に、セルA2の値が配列arrName(1)に、といった具合です。
MsgBox arrName(4)
一番最後の配列の要素をメッセージボックスで表示しています。
しかし、いちいちarrName(0)、arrName(1)・・・、などと指定するならコーディング量は変数と変わらないじゃないか、となります。
そこで一括して登録する方法があります。
Array関数というのを用います。
こうします。
Private Sub CommandButton1_Click()
Dim arrName
arrName = Array(Range("A1").Value, Range("A2").Value, Range("A3").Value, Range("A4").Value, Range("A5").Value)
MsgBox arrName(1)
End Sub
一行ずつ説明します。
Dim arrName
変数の宣言です。配列の宣言ではないことに注意して下さい。
Array関数を用いて配列を一括代入する場合、配列として変数を宣言するのではなく、ただの変数として宣言をします。ただし、この場合データ型は必ずバリアント型でなければなりません。よってこの文を正確に書くとこうなります。
Dim arrName As Variant
これであとで値を順に代入したときに、代入された要素数に応じて、インデックス番号が自動的に付与されます。
arrName = Array(Range("A1").Value, Range("A2").Value, Range("A3").Value, Range("A4").Value, Range("A5").Value)
変数arrNameに、Arrya関数を用いて値を代入しています。セルA1~A5までの値が、それぞれarrName(0)~arrName(4)までの要素として代入されています。5つの値を代入したので、インデックス番号の最大値は4となります。5つ入れたのに4になるのは、前述の通り、インデックス番号の最初の値はデフォルトでは0だからです。0、1、2、3、4で、5つです。
MsgBox arrName(1)
配列変数arrNameの2番目の値をメッセージボックスで表示しています。
さて、これで多少コーディングが楽になりましたが、結局、代入する対象の値をひとつひとつ指定しているのは変わりません。
もっと楽な方法があります。
配列に要素を順に格納するには、繰り返し処理(ループ処理)を用いるのが便利です。これは定石です。
このようにします。
Private Sub CommandButton1_Click()
Dim arrName(4)
For i = 1 To 5
arrName(i - 1) = Cells(i, 1).Value
Next
For i = 0 To 4
MsgBox arrName(i)
Next
End Sub
一行ずつ説明します。
Dim arrName(4)
配列変数arrNameを要素数が5つとして宣言しています。
For i = 1 To 5
5回の繰り返し処理を行います。カウンタ変数は1~5です。
arrName(i - 1) = Cells(i, 1).Value
変数iを用いて、セルA1~A5までの値を、配列arrNameの要素に代入していきます。「arrName(i - 1)」となっているのは、何度もいいますが、インデックス番号は0から始まるからです。カウンタ変数は1から始まっているので、マイナス1をします。この文は一回目のループなら「arrName(1-1) = Cells(1,1).Value」と同じ意味です。さらにいえば1-1は0なので「「arrName(0) = Cells(1,1).Value」」と同じ意味です。
Next
For文の終わりです。
この例ではすべての要素をメッセージボックスに表示したいので、そこでもFor文を用います。
For i = 0 To 4
5回の繰り返し処理を行います。カウンタ変数は0~4です。0から始めるのは、配列の要素数として用いたいからです。
MsgBox arrName(i)
配列arrNameの要素が、インデックス番号0~4まで、順次表示されます。
Next
2回目のFor文の終わりです。
しかし、これではあらかじめ配列を代入する数がわかっていなければなりません。