配列変数

配列変数
どのようなプログラム言語 3.14
でも必ず配列変数というもの
があります。配列変数の概念
1 2 3
は一連のデータを保存しておく
0
引き出しでその引き出しに番
X(0) X(1) X(2) X(3)
号がついているものと考えてく
ださい(右図)。この配列変数は同じ属性を持つデータを入れることを前提とし
ています。配列は行列のデータのようなものの取り扱いに非常に便利です。た
とえば 3 行 3 列の行列の各成分を変数で表すとき A11、A12, A13 というよう
に一つ一つ宣言しているときりがありませんし、汎用性のあるプログラムを作るこ
とは不可能です。というのも行列の大きさが3×3とは決まっていませんし、どの
様なサイズの行列を扱うか決まっていない場合も多々あります。そのような場合
にはプログラムが書けないことになります。このようなときに用いるのが配列です。
配列も変数の一つですので宣言が必要です。例えば、次のように宣言しま
す。
Dim X(10) as Double
配列の宣言はこれまで学んだ変数の宣言とほとんど同じです。異なる点は変
数名に()が含まれていて、その中に数字が書かれている点です。この数字の
意味は何個分のデータの箱を用意すればよいかということを意味します。この
場合ですと10個の箱つまり、X(0)~X(9)まで用意されます。
配列はどのプログラム言語でも利用される非常に重要な事柄です。これなく
してプログラムは書けないことになります。これの利点は同じ性質を持つデータ
をひとまとめにして扱うことができるだけでなく、配列のインデックス(括弧内の数
字)を変数としてあつかうことがで
きる点です。test40 を実行してみ Sub test40()
Dim i As Integer
ましょう。
このプログラムのフローチャー Dim N As Integer
Dim Mx(1000) As Integer
トは下に示す通りです。プログラ
N = InputBox("数値を入力してください")
ムの最初の部分で用いる変数
For i = 1 To N
の定義を行っています。その中
Mx(i) = i*2+1
の 3 番目が配列の宣言です。こ
Cells(i, i) = i
こでは Mx という整数配列で大
Cells(i, i+1) = Mx(i)
きさを 1000 個確保しています。 Next i
次に N に値を読み込んでいま End Sub
す。続いて繰り返しを実行します
が、その際の繰り返し回数を読み
込んだ値 N で変えることができま
す。繰り返し変数は i です。この繰
り返し変数は 1 から N まで変化し、
最終値が N となっています。入力
する N の値によって繰り返し回数が
変わります。
この繰り返し変数が配列のイン
デックスとして指定されています。
例えば N=3 とすると次のように実行
されます。最初に For 文のところへ
来ると i=1 が設定されます。i=1 で
最初の繰り返しに入り、Mx(1)=3
が実行されます。そして、エクセル
の 1 行 1 列に i が代入され、1 行 2 列に Mx(1)の値が代入されます。Next i
まで来ると引き返して For 文を実行し、ここで i=2 となります。ここで i の値が最
終値を超えていないか判断します。それ以降は i=1 の場合と同様に行われま
す。i=3 で繰り返しが終了し、For 文のところへ引き返し、i=4 となった段階で最
終値を超えるので、繰り返しは実行されず終了します。
i
1
2
3
実行
Mx(1)=3
Mx(2)=5
Mx(3)=7
3回くらいの繰り返しなら、直接書いてもたいしたことはありませんが、100回、1
000回となると直接書くことは現実的ではありません。配列の有効性が発揮さ
れます。
test40 のようにエクセルに数値を表示するだけならわざわざ配列を利用せずと
もプログラムは作成可能です。配列の有効な使い方は配列に保存してあるデ
ータを取り出して処理する方法です。具体的に考えてみましょう。
例 金額を読込み、必要な紙幣
(10000 円札、5000 円札、1000 円
札)と硬貨(500 円玉、100 円玉、50
円玉、10 円玉、5 円玉、1 円玉)の数
を求めるプログラムを作成せよ。
このプログラムの場合、必要な額面の
大きい方から割り算をします。その商が
必要な紙幣、硬貨の枚数になります。
た と え ば 21253 円 の 場 合 、 ま ず 、
10000 円 札 を 考 え ま す 。 21253 を
10000 で割ると商が 2 になります。これ
が必要な 10000 円札の枚数です。次
に、割り算の余り(剰余)を 5000 で割り
算を行い、その商が 5000 円札
の枚数になります。さらにその余 Sub test41()
Dim i As Integer
りを同様に計算すると必要な紙 Dim m(20) As Long
幣と硬貨の枚数を求めることが Dim k(20) As Long
Dim kingaku As Long
できます。
Dim L As Long
この計算を行う場合、10000, k(1) = 10000
5000,1000,500,100 , 50 , 10 , k(2) = 5000
5,1 という数字の並びは規則 k(3) = 1000
的に見えますが、2 分の1と 5 k(4) = 500
k(5) = 100
①
分の1が交互に繰り返すため、 k(6) = 50
プログラムで表す場合には規 k(7) = 10
則的には記述することができま k(8) = 5
k(9) = 1
せん。そこで、この数値を配列 kingaku = InputBox("金額を入力してください")
に保存しておき、繰り返し計算を L= kingaku
For i = 1 To 9
することで計算します。
m(i) = L ¥ k(i)
test41 がそのプログラムです。
l = L Mod k(i) ②
実行してみてください。①の部 Next i
分では紙幣、硬貨の額面を配 For i = 1 To 9
Cells(20, i) = k(i)
列kに保存しています。②の部
Cells(21, i) = m(i)
分で計算を行っています が、 Next i
¥記号は L を k(i)で割った時の End Sub
商を求める演算子です。割り算
として/を用いると小数点以下まで求める割り算となりますが、¥を使うと整数
の商を求めることができます。さらに次の行で Mod という演算子があります。こ
れは割り算をした時の余りを求める演算子です。便利なので覚えておいてくださ
い。
先ほどの例で考えると 21253 円の場合、②の繰り返しに入ると最初、i=1 と
なります。L=21253 を k(1)=10000 で割った商は 2 で、これが 10000 円札の枚
数として m(1)に保存されます。次の行では L Mod k(1)で 21253 を 10000 で
割った場合の余り(1253)が改めて L に保存されます。これが以下のように繰り
返されます。
i
L(入)
k(i)
m(i)
L(出)
1
21253
10000
2
1253
2
1253
5000
0
1253
3
1253
1000
1
253
4
253
500
0
253
5
253
100
2
53
6
53
50
1
3
7
3
10
0
3
8
3
5
0
3
9
3
1
3
0
配列は1次元だけでなく、多次元配列も用いることができます。多次元配列
の定義は次の通りです。
Dim X(10,10) as Double
これは2次元配列の例です。2次
元配列のインデックスは2つあり、
右図のようなイメージを持ってくださ X(0,0) X(0,1) X(0,2) X(0,3) X(0,4) X(0,5)
い。これはまさに行列そのもので
X(1,0) X(1,1) X(1,2) X(1,3) X(1,4) X(1,5)
す。行列の成分を示すときにインデ
X(2,0) X(2,1) X(2,2) X(2,3) X(2,4) X(2,5)
ックスでそのまま指定することがで
きます。2次元配列だけでなく3次
X(3,0) X(3,1) X(3,2) X(3,3) X(3,4) X(3,5)
元、4次元と次元を増やすことが
可能です。ただし、次元数(最大6
0次元)が増えると急速に必要なメ Sub test42()
Dim i As Integer
モリの量も増えます。
Dim j As Integer
2次元の配列を扱うときには繰り返
Dim x(10, 10) As Integer
し命令で学んだ For 文を2重にして For i = 1 To 10
扱うと便利です。test42 を実行してみ
For j = 1 To 10
てください。実行結果はエクセルの
x(i, j) = 10 * (i - 1) + j
表に配列xに値が代入された順番
Next j
が 表 示 さ れ ま す 。 こ の 結 果 で は Next i
x(1,1)が一番最初に処理され、2 番 For i = 1 To 10
For j = 1 To 10
目は x(1,2)、3 番目が x(1,3)というよ
Cells(i, j) = x(i, j)
うに続くのがわかります。これはプログ
Next j
ラムの 2 重になった繰り返しの内側
Next i
が最初に処理されるためです。最初 End Sub
に 2 重の繰り返しの外側で i=1 が設
定されます。そして、内側の繰り返しに入ると i=1 のまま、j が1から10まで変化
します。内側の繰り返しが終了すると、次に外側の繰り返しで i=2 が設定され
ます。そして、内側の繰り返しでもう一度jが1から10まで変化します。すなわち、
一つの i の値に対して 10 回内側の繰り返しが実行されますので、この 2 重の
繰り返しは全部で 100 回配列xに値を代入しています。エクセルの表の最大
値は 100 になっているはずです。
このように、繰り返し命令は何重にもすることができます。注意しなければいけ
ない点はきちんと入れ子構造になっていることです。つまり、次のような構造の
繰り返し命令はエラーとなります。この For i = 1 To 10
例では繰り返し変数 i の繰り返し命令
For j = 1 To 10
x(i, j) = 10 * (i - 1) + j
と j の繰り返し命令が部分的に重なっ
Next i
ています。このような構造では i の繰り
返しの途中で j の値が変化したり、j の Next j
繰り返しの途中で i が変化したりしま
す。これではきちんとした計算ができません。このような構造にしないでください。
test43 は行列の積の計
算を行うプログラムでです。
A1 から C3 のセルに入力
した行列 a と A5 から C7 に
入力した行列 b の積を計
算します。
行列の積の計算は囲っ
たように 3 重の繰り返し計算
になっています。例えば行
列の積の 1 行 1 列の成分
は a×b においては a 行列
の 1 行目と b 行列の 1 列
目の成分の積の和です。
す な わ ち 、 a(1,1) *
b(1,1)+a(1,2)*b(2,1)+
a(1,3)*b(3,1)が積の 1 行 1
列成分になります。
Sub test43()
Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim a(10, 10) As Double
Dim b(10, 10) As Double
Dim c(10, 10) As Double
For i = 1 To 3
For j = 1 To 3
a(i, j) = Cells(i, j)
b(i, j) = Cells(i + 4, j)
Next j
Next i
For i = 1 To 3
For j = 1 To 3
For k = 1 To 3
c(i, j) = c(i, j) + a(i, k) * b(k, j)
Next k
Next j
Next i
For i = 1 To 3
For j = 1 To 3
Cells(i, j + 5) = a(i, j)
Cells(i + 4, j + 5) = b(i, j)
Cells(i + 8, j + 5) = c(i, j)
Next j
Next i
End Sub