「配列」とは?
今回は「配列」について解説いたします。
そもそも配列とは何か?
分かりやすく言えば、1つの変数に対して、複数の値を入れられる事です。
サンプルコードにて説明します。
Sub test16()
Dim A(2) As String
A(0) = "ニワトリ"
A(1) = "カモ"
A(2) = "ペンギン"
MsgBox A(0)
MsgBox A(1)
MsgBox A(2)
End Sub
「Dim A(2) As String」は文字列型で宣言していますが、括弧と数字があります。
イメージとしては、変数Aという箱が3つあり、変数Aの箱にそれぞれ「0番」「1番」「2番」が付いている感じです。
これが配列であり、この場合は「配列A」になります。
この3つの箱の数は「要素数」と呼ばれ、配列Aの要素数は「3」になります。
配列の箱は、予め数を用意できます。
このような配列を「静的配列」と呼びます。
このサンプルコードを実行すると以下の通りになります。
しかしこれだけ見ると、わざわざ配列にしなくても、変数を3個用意すれば同じです。
そこで配列の利点について説明いたします。
例えば、今回は3個しか値がありませんでしたが、これが100個の場合はどうでしょうか?
かなりコードが長くなる事が想像できると思います。
そこで、配列ではループ処理を使う事で、コードを短くする事ができます。
以下のサンプルコードを見て下さい。
Sub test16a()
Dim A(2) As String
A(0) = "ニワトリ"
A(1) = "カモ"
A(2) = "ペンギン"
For i = 0 To 2
MsgBox A(i)
Next
End Sub
For文を使うことで、3行記入していたMsgBoxを1行で表す事ができます。
今回は文字列型で配列を使いましたが、もちろん数値型などでも配列を使うことができます。
配列は様々なデータを処理する上で欠かせません。
簡単なプログラムでは、配列を使う事なく処理できますが、大規模になればなるほど、配列は必ず使われているでしょう。
しっかりと覚えておきましょう。
<補足情報>動的配列について
「動的配列」と利用例
先程の解説では「静的配列」について説明しました。
静的とは、言い換えれば固定であり、配列数が3個に固定されていたので、静的な配列と呼ばれています。
一方で、配列数を固定せず、プログラムの中で必要に応じて用意する事も可能です。
これを「動的配列」と呼びます。
ちなみにですが、コンピュータの世界では「静的:Static(スタティック)」と「動的:Dynamic(ダイナミック)」という表現は、値を固定しているか固定していないかで、しばしば使われますので覚えておきましょう。
以下に動的配列のサンプルコードを用意しました。
Sub test16b()
'動的配列の宣言
Dim A() As String
'要素数を定義する
ReDim A(3)
A(0) = "ニワトリ"
A(1) = "カモ"
A(2) = "ペンギン"
A(3) = "カラス"
For i = 0 To 3
MsgBox A(i)
Next
End Sub
配列を宣言する際に「Dim A() As String」と要素数を入れてません。
これが動的配列になります。
しかし、動的配列を使うには、要素数を定義してあげる必要があります。
ReDim <配列名>(<定義する要素数>)
「ReDim A(3)」が動的配列の要素数定義になります。
これだけ見れば、静的配列も動的配列もあまり変わりません、
むしろ動的配列の方が面倒です。
しかしプログラムによっては、この要素数が決まっていないケースがある場合、この動的配列は有効です。
これまでVBAの話を中心にしてきましたが、本サイトではエクセルVBAについて解説していく予定なので、エクセルを絡めて説明します。
以下のサンプルコードと「画像3:入力されたエクセル」を見て下さい。
Sub test16c()
'動的配列の宣言
Dim A() As String
'要素数を入れるための変数宣言
Dim ElementNum As Integer
'エクセルのシートA列に入力されている数を代入
ElementNum = WorksheetFunction.CountA(Range("A:A"))
'要素数を定義する
ReDim A(1 To ElementNum)
For i = 1 To ElementNum
'エクセルの値を取得
A(i) = Cells(i, 1).Value
MsgBox A(i)
Next
End Sub
少し複雑化してますが、とりあえず1つずつ解説いたします。
'動的配列の宣言
Dim A() As String
'要素数を入れるための変数宣言
Dim ElementNum As Integer
まず動的配列と変数宣言をしています。
この変数「ElementNum」には、動的配列の要素数を代入する予定です。
'エクセルのシートA列に入力されている数を代入
ElementNum = WorksheetFunction.CountA(Range("A:A"))
ここでは、エクセルのA列にいくつ値が入っているかを取得しています。
「WorksheetFunction.CountA(Range(“A:A”))」については、今後詳しく解説しますので、現時点では「A列に値が入っている数を取得している」とだけ理解していただければ問題ありません。
A列には「山田」「田中」「加藤」の3つの値が入ってます。
よって変数ElementNumは「3」になります。
'要素数を定義する
ReDim A(1 To ElementNum)
要素数を定義するのに「To」が出てきました。
これは例えば、配列宣言(Dim)、配列数の再定義(ReDim)のどちらでも使う事ができます。
「A(2 To 4)」とした場合、「配列A(2)」「配列A(3)」「配列A(4)」として、3つの要素が定義されます。
配列はこの「To」を使わなければ、通常配列番号は「0」からです。
今回配列番号を1から始める理由は、後で述べますが、このような使い方ができる事を覚えておきましょう。
配列Aは「A(1 To ElementNum)」->「A(1 To 3)」となり、「A(1)」「A(2)」「A(3)」が用意され、要素数は3個になりました。
For i = 1 To ElementNum
'エクセルの値を取得
A(i) = Cells(i, 1).Value
MsgBox A(i)
Next
最後はFor文のループ処理です。
「For i = 1 To ElementNum」は「For i = 1 To 3」です。
3回繰り返す事になります。
「A(i) = Cells(i, 1).Value」は、A列の1行目の値を取得しています。
これについて少し説明しますが、後々に詳しく解説しますので、今は何となく程度で覚えて下さい。
このCellsは「Cells(<行番号>,<列番号>).Value」で、エクセルの値を取得できます。
エクセルのA列1行目は、1行目なので行番号が「1」で、A列は1列目なので列番号は「1」になります。
For分でループ処理させる事で、「Cells(i, 1).Value」は「Cells(1, 1).Value」「Cells(2, 1).Value」「Cells(3, 1).Value」となり、「A列1行目」「A列2行目」「A列3行目」を取得しています。
先程「配列番号を1から始める理由」について答えると、配列番号を「0」からスタートした場合、「Cells(0, 1).Value」で存在しない行を取得することでエラーになるからです。
「MsgBox A(i)」ではそれぞれ、「山田」「田中」「加藤」が出力されます。
エクセルのA列の値が今回は3つでしたが、5つだったらどうでしょうか?
「山田」「田中」「加藤」「北島」「新岡」と5行入力されていた場合、もし静的配列だったら、プログラムコードの配列要素数を変更する必要があります。
しかし、今回のtest16c関数では、エクセルから取得した値に応じて、柔軟に要素数の変更ができ、プログラムコードの変更が必要ありません。
このような場合、動的配列は有効と言えます。