[Excel2013 で VBA] 配列

今回は、複数のデータを格納する「配列」について取扱う。

配列は「あるクラス全員の成績のデータ」などのように、複数のデータをまとめて取扱った方が都合が良い場合に用いる。

また、配列の要素を参照する場合、For 文などの繰りかえしを用いる事も多く、 前回までの内容にも深く関わって来る。

配列はどのような時に必要か

冒頭で述べた様に、配列とは、複数のデータを格納できるデータ構造であるが、 どのような時に有用であるかを示すため、 という課題を考えてみよう。

第四回-01にて「1〜10 の和を計算」という問題を For 文で記述したので、それと同様な記述をしたいところである。
その際は以下の様な記述をした。

s=0
For x=1 To 10 
     s = s + x
Next x


この考え方に従えば、命令「s = s + x」において、「x」の部分を 「学籍番号 x の学生のテストの点」に置き換えることができれば、
このクラスのテストの合計点が計算できることがわかるだろう。

ここで、テストの点数は一人一人なんらかの変数に格納されていると考えよう。
ここまで学んだ知識だけでは、テストの点数は以下の様に変数を沢山用意して一つ一つに格納するしかない

Dim result1 As Integer
Dim result2 As Integer
Dim result3 As Integer
…
Dim result10 As Integer

result1 = 10
result2 = 63
result3 = 82
…
result10 = 98


「テストの結果」という意味があることが分かりやすいよう、変数名は result + 数字とした。

さて上のような状況で、 For 文を用いて 10 人のテストの点数 (result1 〜 result10) の合計を計算できるだろうか?
以下のような記述をしたくなるところだが、結論から言うと、以下の記述は実行できない

s=0
For x=1 To 10 
     s = s + resultx
Next x


なぜ上の記述ができないかというと、 result1 〜 result10 は単なる変数の名前であって、
整数 1〜10 を単なる変数名 result1 〜 result10 に関連づけることはできない
からである。

上記の例題のような場合に適したデータ構造が配列である。
配列を用いれば、複数のデータをまとめて扱い、「x 番目のデータ」を 簡単に取りだすことができるようになる。


配列の使用例 (整数)

今、10 人のクラスのテストの合計点を計算するという例題について、 配列を実際に使ってみよう。

まず、通常の変数と同様に、配列にも型があり宣言がが必要である。
今、テストの点数であるので、Integer 型で良い。 10 人のテストの点数を格納したいので、要素数 10 の配列を宣言する。

Dim result(10) As Integer


上記が要素数 10 の整数型の配列の宣言である。

(なお、配列の名前 (result) が複数文字であるのは本質的ではない。
今まで通りの 1 文字の変数名で配列を宣言したければ 「Dim a(10) As Integer」などとする)

このように宣言すると、「result(1), result(2), result(3)〜result(10)」 が変数のように利用できるようになる。

result(1) = 10
result(2) = 63
result(3) = 82
…
result(10) = 82


重要なことは、「x 番目のデータ」を「result(x)」で簡単に取りだせることである。

(補足)
なお、C++ や Java など、他のプログラミング言語に通じている人のために触れておくと、
VBA では「Dim result(10) As Integer」という宣言で
result(0), result(1), …, result(10)
の 11 個のデータが利用できる。

「Dim result(9) As Integer」と宣言するようにすれば C++ や Java と同様
result(0), result(1), …, result(9)
の 10 個のデータが利用できるようになる。

これにより、クラスの合計点が簡単に計算できる。以下の例では平均点も求めている。



上記のプログラムを記述し、動作を確かめよ。
(Visual Basic Editor の起動方法は「第一回:プログラムを書き始めるまでの準備」参照)

以下、若干を注意を挙げる。
result(1) = 10: result(2) = 38: result(3) = 81: result(4) = 68
result(5) = 52: result(6) = 71: result(7) = 61: result(8) = 98
result(9) = 41: result(10) = 68



配列の使用例 (文字列)

配列は整数 Integer だけではなく、Visual Basic で使えるあらゆる型で同様に 用いることができる。
以下の例は文字列 String 型について配列を利用したものである。
1 〜 10 の数字を入力すると、それに対応する英語名が表示される。

こちらも記述して実行してみよう。



以下、若干を注意を挙げる。
eng(1) = "one": eng(2) = "two": eng(3) = "three": eng(4) = "four"
eng(5) = "five": eng(6) = "six": eng(7) = "seven": eng(8) = "eight"
 eng(9) = "nine": eng(10) = "ten"

重要なことは、入力 (1 〜10) の値が格納された x から英語名を呼び出す命令が

MsgBox x & "は英語で" & eng(x)


1 行で済んでいることである。

もしこれが配列ではなく eng1, eng2, … eng10 のように 10 個の変数に格納されていたら、
以下の様に x の値に応じた If 文が必要になる。これは非常に無駄が多いことが分かるであろう。

' 配列を使わないと…?
If x = 1 Then
   MsgBox x & "は英語で" & eng1
ElseIf x = 2 Then
   MsgBox x & "は英語で" & eng2
ElseIf x = 3 Then
   MsgBox x & "は英語で" & eng3
…
ElseIf x = 10 Then
   MsgBox x & "は英語で" & eng10
End If



配列の動的確保

配列を覚えると、以下のように配列のサイズを変数で決めたくなることがある。
しかし、このような記述では「コンパイルエラー : 定数式が必要です」というエラーにより実行できない。

これは、配列の数は「変数」ではなく、「定数」で指定しなければならないためである。

' 「コンパイルエラー : 定数式が必要です」というエラーが出る
Dim n As Integer
n = 10
Dim x(n) As Integer  ' 1〜n の配列が利用したいのだが…?

変数で配列のサイズを決めたい時は以下のように ReDim ステートメントを用いる。

' こちらは正しく動作する
Dim n As Integer
n = 10
Dim x() As Integer
ReDim x(n)

' x(0) から x(n) まで利用可能

Erase x


ReDim で確保した配列は、利用が終了したら Erase で削除する。



←繰り返し (続き)プロシージャと変数→

Excel 2013 で学ぶ Visual Basic for Applications (VBA)に戻る