第10講 Sub プロシージャと Function プロシージャの呼び出し
第1話 Sub プロシージャ
さて、みなさん第9講で作った4次魔方陣プログラム解答例を改良して、
B | C | D | E | F | G | H | I | J | K | L | M | |
5 | 自然配列 | 検証 | 34 | |||||||||
6 | 1 | 2 | 3 | 4 | 16 | 2 | 3 | 13 | 34 | |||
7 | 5 | 6 | 7 | 8 | 5 | 11 | 10 | 8 | 34 | |||
8 | 9 | 10 | 11 | 12 | 9 | 7 | 6 | 12 | 34 | |||
9 | 13 | 14 | 15 | 16 | 4 | 14 | 15 | 1 | 34 | |||
10 | 34 | 34 | 34 | 34 | 34 | |||||||
11 | 自然配列から作った4次魔方陣 | |||||||||||
12 | 16 | 2 | 3 | 13 | ||||||||
13 | 5 | 11 | 10 | 8 | ||||||||
14 | 9 | 7 | 6 | 12 | ||||||||
15 | 4 | 14 | 15 | 1 |
のように表示するプログラムを作りたいとします。
(excel上ではB列とI列は広がっていません。excelのセルは入りきらない場合、セルをまたいで表示されるからです。)
皆さん、下の改良例を見る前にぜひ考えてください。
改良例
改良例のプログラムソースは次のようになっています。
Private Sub CommandButton1_Click()
Dim i As Integer, j As Integer, wa As Integer, sizenhairetu(4, 4) As Integer, mah(4, 4) As Integer
For i = 1 To 4
For j = 1 To 4
sizenhairetu(i, j) = 4 * (i - 1) + j
Next
Next
For i = 1 To 4
For j = 1 To 4
If (i <> j And j <> 5 - i) Then
mah(i, j) = sizenhairetu(i, j)
End If
Next
Next
For i = 1 To 4
mah(i, i) = sizenhairetu(5 - i, 5 - i)
mah(i, 5 - i) = sizenhairetu(5 - i, i)
Next
Cells(5, 2) = "自然配列"
Cells(11, 2) = "自然配列から作った4次魔方陣"
For i = 1 To 4
For j = 1 To 4
Cells(5 + i, 1 + j) = sizenhairetu(i, j)
Cells(11 + i, 1 + j) = mah(i, j)
Next
Next
Cells(5, 9) = "検証"
For i = 1 To 4
For j = 1 To 4
Cells(5 + i, 8 + j) = mah(i, j)
Next
Next
For i = 1 To 4
wa = 0
For j = 1 To 4
wa = wa + mah(j, i)
Next
Cells(10, 8 + i) = wa
Next
For i = 1 To 4
wa = 0
For j = 1 To 4
wa = wa + mah(i, j)
Next
Cells(5 + i, 13) = wa
Next
wa = 0
For i = 1 To 4
wa = wa + mah(i, i)
Next
Cells(10, 13) = wa
wa = 0
For i = 1 To 4
wa = wa + mah(i, 5 - i)
Next
Cells(5, 13) = wa
End Sub
非常にプログラムが長くなり、わかりにくくなっています。
実は、わかりやすいプログラムを目指す構造化プログラミングからすると、
褒められたプログラムではありません。
ソフト開発などの大きなプログラム制作では、
分業になります。
それぞれが分担して仕事をすることになります。
分担するためにはプログラムがわかりやすく、
分担したプログラムがいろいろな場面で使える独立した部品になっていなければなりません。
Mainのプログラムと沢山のSubのプログラムからなっていて、
それぞれが独立していなければなりません。
BASICの頃、Subプログラムはありましたが、Mainや他のSubから独立していなくて、
例えば、Mainで変数をいじると、それが現在対象としているSubに影響を与えて、
全体がスパゲッティのように絡み合ったわかりにくいプログラムとなってしまっていました。
それを解消するために、Quick BasicやVisual BasicでMainや他のSubから影響を受けない、
Subプロシージャを作り、
他の部分を考慮せずそのSubプログラムだけで作業が進められるようにしました。
個々が独立した部品となり、共同で開発できるプログラム手法を
構造化プログラミングと呼ぶのです。
上のプログラムの
Private Sub CommandButton1_Click()
Dim i As Integer, j As Integer, wa As Integer, sizenhairetu(4,
4) As Integer, mah(4, 4) As Integer
For i = 1 To 4
For j = 1 To 4
sizenhairetu(i, j) = 4 * (i - 1) + j
Next
Next
For i = 1 To 4
For j = 1 To 4
If (i <> j And j <> 5 - i) Then
mah(i, j) = sizenhairetu(i, j)
End If
Next
Next
For i = 1 To 4
mah(i, i) = sizenhairetu(5 - i, 5 - i)
mah(i, 5 - i) = sizenhairetu(5 - i, i)
Next
Cells(5, 2) = "自然配列"
Cells(11, 2) = "自然配列から作った4次魔方陣"
For i = 1 To 4
For j = 1 To 4
Cells(5 + i, 1 + j) = sizenhairetu(i, j)
Cells(11 + i, 1 + j) = mah(i, j)
Next
Next
Cells(5, 9) = "検証"
For i = 1 To 4
For j = 1 To 4
Cells(5 + i, 8 + j) = mah(i, j)
Next
Next
For i = 1 To 4
wa = 0
For j = 1 To 4
wa = wa + mah(j, i)
Next
Cells(10, 8 + i) = wa
Next
For i = 1 To 4
wa = 0
For j = 1 To 4
wa = wa + mah(i, j)
Next
Cells(5 + i, 13) = wa
Next
wa = 0
For i = 1 To 4
wa = wa + mah(i, i)
Next
Cells(10, 13) = wa
wa = 0
For i = 1 To 4
wa = wa + mah(i, 5 - i)
Next
Cells(5, 13) = wa
End Sub
色をつけたところを独立させ、Subプロシージャに担当させれば、
今のプログラムはMainの部分は例えば次のようにすっきりさせることができます。
Dim sizenhairetu(4, 4) As Integer, mah(4, 4) As Integer
Private Sub CommandButton1_Click()
sizenhairetusakusei
mahoujinsakusei
hyouji
kensyou
End Sub
このようにすると、全体を簡単に見通すことができます。
さらに、kensyouの部分を5つのSubプロシージャに分ければ、
構造がよりはっきり把握できます。
Sub kensyou()
Cells(5, 9) = "検証"
hukusya
retugoukei
gyougoukei
taikakusengoukei
gyakutaikakusengoukei