第2話 Sub プロシージャの作り方
Subプロシージャの作り方の説明に入る前に、
一つだけ注意したい点があります。
前話の
Dim sizenhairetu(4, 4), mah(4, 4) As Integer
Private Sub CommandButton1_Click()
sizenhairetusakusei
mahoujinsakusei
hyouji
kensyou
End Sub
のDim sizenhairetu(4, 4), mah(4, 4) As Integer
に注意していただきたいのです。実は、
Private Sub CommandButton1_Click()
sizenhairetusakusei
mahoujinsakusei
hyouji
kensyou
End Sub
の内側で宣言しても意味がありません。
理由はVisual BasicのMainやSubプロシージャの独立性にあります。
変数や配列を宣言しても、
MainやSubプロシージャ内部でしか有効でないのです。
したがって、例えMainで宣言してあっても、
他のプロシージャでは有効ではありませんので、
他のプロシージャでmah(1,2)などを使おうとすると、
定義されていませんと出てきてしまうのです。
不便なようですが、
このために変数や配列の値が他のプロシージャで変更される危険がないので、
他のプロシージャを考慮せず、そのプロシージャのみの作業に専念できるのです。
他のSubプロシージャで使われている変数名と同じ変数名を使っていたとしても、
その該当のプロシージャのみで有効なので、
他のプロシージャで変数の値を書き換えられてしまう心配がないのです。
BASICでは、変数名が同じだと値が他のSubプログラムで書き換えられてしまい、
結局はプログラム全体を理解していないと作成できないスパゲッティプログラムに
なっていたのです。
その大きな問題点を改善し、
構造化プログラミングができるようにしたのです。
変数や配列はプロシージャ内のローカルなものです。
すべてのプロシージャで共通に使うグローバルな変数や配列にしたいときは、
すべてのプロシージャの前つまりプログラムの一番前に
宣言しなければならないのです。
Subプロシージャの作り方は簡単です。
例えば、Subプロシージャsizenhairetusakuseiを作る場合、
Private Sub CommandButton1_Click()
sizenhairetusakusei
mahoujinsakusei
hyouji
kensyou
End Sub
の外側で
Sub sizenhairetusakusei()
とタイピングしてEnterキーを押せばいいのです。
すると、自動的に
Sub sizenhairetusakusei()
End Sub
となって、Subプロシージャsizenhairetusakuseiができるのです。
そして、中に
Dim i As Integer, j As Integer
For i = 1 To 4
For j = 1 To 4
sizenhairetu(i, j) = 4 * (i - 1) + j
Next
Next
と入力すればよいのです。
以上のようにして、Subプロシージャ版のプログラムが出来上がります。
注意点は
Sub sizenhairetusakusei()
Dim i As Integer, j As Integer
For i = 1 To 4
For j = 1 To 4
sizenhairetu(i, j) = 4 * (i - 1) + j
Next
Next
End Sub
Sub mahoujinsakusei()
Dim i As Integer, j As Integer
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
End Sub
Dim i As Integer, j As IntegerとDim i As Integer, j As Integer
のいずれも必要だということです。
Subプロシージャ内でしか通用しない、ローカル変数だからです。
Subプロシージャ内でしか通用しないので、
変数名が同じでも他のプロシージャで書き換えられる心配がないのです。
では皆さん、Subプロシージャkensyouは
Sub kensyou()
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プロシージャを作り、
Sub kensyou()
Cells(5, 9) = "検証"
hukusya
retugoukei
gyougoukei
taikakusengoukei
gyakutaikakusengoukei