[Excel で VBA] 配列

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

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

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

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

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

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

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

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

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

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 i = 1 To 10 
     s = s + resulti
Next i

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

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


配列の宣言と利用

上で述べたように、配列とは複数のデータを格納するためのデータ構造である。
整数を5つ格納できる配列 x を定義し、利用するという以下のプログラムを元に、配列について解説していこう。

Sub prog()
	Dim i As Integer
	Dim x(5) As Integer   ' 整数を格納できる要素数 5 の配列の宣言

	x(1) = 10    ' 配列へのデータの書き込み
	x(2) = 2
	x(3) = 0
	x(4) = -5
	x(5) = -23

	' 配列のデータをMsgBoxで表示
	For i = 1 To 5
		MsgBox "配列xの" & i & "番目の値は" & x(i)
	Next i
End Sub

このプログラムを実行したときに現れる MsgBox の一つ目が下図である。第四回で体験したように、
5回繰り返す For 文内部に MsgBox 命令を書いたので、5回OKボタンをクリックしないとプログラムが終了しないことに注意しよう。



さて、プログラム中で「Dim x(5) As Integer」の部分に着目して欲しい。
これは、整数を5つ格納できる配列 x を定義する命令である。

変数について学んだ時と同じ考え方をすれば、これは「整数を5つ格納できる棚」を用意したことに相当する。



図に示されているように、「Dim x(5) As Integer」という宣言で、x(1)、x(2)、x(3)、x(4)、x(5) という名前の箱 (変数) が使えるようになる、と考えればよい。

[プログラミングに興味がある学生向けの注意]
正確に言うと、Visual Basic における配列では、
Dim x(5) As Integer
という宣言により、x(0)、x(1)、x(2)、x(3)、x(4)、x(5) の 6 つの変数が使える。
しかし、話がややこしくなるため、以下では「x(1)、x(2)、x(3)、x(4)、x(5) の5つが使える」という方式で解説を続ける。

上のプログラム例では、配列の 5 つの要素 x(1) ~ x(5) に値を格納する際、以下のように変数と同様に代入文を書いていた。

	x(1) = 10;    ' 配列へのデータの書き込み
	x(2) = 2;
	x(3) = 0;
	x(4) = -5;
	x(5) = -23;

この5つの命令により、以下のような状況が生まれる。
変数に慣れている学生にはそれほど違和感はないであろう。



また、上のプログラム例では、配列のそれぞれの要素に格納された値を MsgBox で表示する際、
以下のように for 文を使っていたことに注意して欲しい。

	For i = 1 To 5
		MsgBox "配列xの" & i & "番目の値は" & x(i)
	Next i

「For i = 1 To 5」により、「i が 1 から 5 まで変化する」という For 文となり、
x(i) を MsgBox で表示することで x(1) ~ x(5) の全てが表示されるのである。


配列の使用例 (整数)

さて、配列の考え方が分かったところで、冒頭で紹介した10 人のクラスのテストの合計点を計算するという例題を考えてみよう。

10 人のテストの点数を格納するために、Integer 型の要素数 10 の配列を宣言する。

Dim result(10) As Integer

なお、変数と同様、配列の名前が複数文字で構成されていても構わない。

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

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


重要なことは、「i 番目のデータ」を「result(i)」で簡単に取りだせることである。
これにより、クラスの合計点が簡単に計算できる。以下の例では平均点も求めている。



上記のプログラムを記述し、動作を確かめよ。
(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 で削除する。



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

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