第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 

End Sub

では、Subプロシージャの作り方は次話で。

第9講第2話へ 第10講2話へ