第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 IntegerDim 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 

End Sub
としてみましょう。

解答例

第1話へ 第3話へ