第5講 Subプロシージャ

第2話 Subプロシージャによる各部分の独立

皆さん、心がけていただきたいことがあります。
それは部品を余り大きくしないということです。
プログラム本体が大きくなったら独立プロシージャに分けるべきです。
『成績一覧表改良版』実行コード(Private Sub CommandButton1_Click)が
Private Sub CommandButton1_Click()
  Dim i As Byte, j As Byte

  '各生徒の合計点・平均点の計算
  For i = 1 To 40
    w = 0
    For j = 1 To 5
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 7) = w
    Cells(6 + i, 8) = w / 5
  Next


  '各教科等の合計点・平均点の計算
  For i = 1 To 7
    w = 0
    For j = 1 To 40
      w = w + Cells(6 + j, 1 + i)
    Next
    Cells(47, 1 + i) = w
    Cells(48, 1 + i) = w / 40
  Next

  '各生徒の合否判定
  For i = 1 To 40
    If Cells(6 + i, 7) >= 300 Then
      Cells(6 + i, 11) = "合格"
    End If
    If Cells(6 + i, 7) < 300 Then
      Cells(6 + i, 11) = "不合格"
    End If
  Next


  '各生徒の講評
  For i = 1 To 40
    If Cells(6 + i, 7) >= 350 Then
      Cells(6 + i, 12) = "あなたはかなり優秀です。"
    End If
    If Cells(6 + i, 7) < 350 And Cells(6 + i, 7) >= 300 Then
      Cells(6 + i, 12) = "おめでとう。"
    End If
    If Cells(6 + i, 7) < 300 And Cells(6 + i, 7) >= 200 Then
      Cells(6 + i, 12) = "合格まで後一歩です。"
    End If
    If Cells(6 + i, 7) < 200 Then
      Cells(6 + i, 12) = "かなりのがんばりが必要です。"
    End If
  Next


  '各生徒の最高点の算出
  Dim max As Integer
  For i = 1 To 40
    max = 0
    For j = 1 To 5
      If Cells(6 + i, 1 + j) >= max Then max = Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 9) = max
  Next


  '各生徒の最低点の算出
  Dim min As Integer
  For i = 1 To 40
    min = 100
    For j = 1 To 5
      If Cells(6 + i, 1 + j) < min Then min = Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 10) = min
  Next


  '各教科と合計・平均の最高点の算出
  For i = 1 To 7
    max = 0
    For j = 1 To 40
      If Cells(6 + j, 1 + i) > max Then max = Cells(6 + j, 1 + i)
    Next
    Cells(49, 1 + i) = max
  Next

  '各教科と合計・平均の最低点の算出
  For i = 1 To 7
    min = 500
    For j = 1 To 40
      If Cells(6 + j, 1 + i) < min Then min = Cells(6 + j, 1 + i)
    Next
    Cells(50, 1 + i) = min
  Next


End Sub
とかなり大きくなっています。そこで、色を付けた部分を独立させたいと思います。
  Dim i As Byte, j As Byte
は必要に応じて、各独立部品に組み囲まなければなくなります。
それは、部品の独立性のためです。順に、部品名を
f1 f2 f3 f4 f5 f6 f7 f8 (各部分は色に対応している。)
名付けると、実行コード(Private Sub CommandButton1_Click)は
Private Sub CommandButton1_Click()

  f1 '各生徒の合計点・平均点の計算
  f2 '各教科等の合計点・平均点の計算
  
f3 '各生徒の合否判定
  f4 '各生徒の講評
  f5 '各生徒の最高点の算出
  f6 '各生徒の最低点の算出
  f7 '各教科と合計・平均の最高点の算出
  f8 '各教科と合計・平均の最低点の算出

End Sub
とすっきりしたものになります。変数名と同じくプロシージャ名も自由に付けることが出来ますので、
例えば、f1は、kakuseitonogoukeitentoheikintennosansyutu()と名付けてもいいわけですが、
この講義に方針に、変数名やプロシージャ名を短くというものがありますので、
f1としたわけです。
変数名やプロシージャ名が短くても注釈文('のついたコメント、REM文ともいう)を付ければ、
働きは明らかです。

では、Subプロシージャf1を作るにはどうしたよいでしょうか。
簡単です。
Private Sub CommandButton1_Click()
      ・
      ・
      ・
End Sub
の外側でSub f1()と打ってリターンすればよいのです。
すると自動的に
y001
Sub f1が出来ます。
Private Sub CommandButton1_Click

  '各生徒の合計点・平均点の計算
  For i = 1 To 40
    w = 0
    For j = 1 To 5
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 7) = w
    Cells(6 + i, 8) = w / 5
  Next
の部分を範囲指定して、右クリックして
Sub f1()
ここにペースト
End Sub
Sub f1()とEnd Subの間に貼り付けてください。
Sub f1()
  '生徒の合計点・平均点の計算
  For i = 1 To 40
    w = 0
    For j = 1 To 5
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 7) = w
    Cells(6 + i, 8) = w / 5
  Next
End Sub
独立しているため、
Dim i As Byte, j As Byteが必要なので、それをPrivate Sub CommandButton1_Clickからコピペして、
見栄えをよくするために適当に改行します。
Sub f1()

  Dim i As Byte, j As Byte

  '生徒の合計点・平均点の計算
  For i = 1 To 40
    w = 0
    For j = 1 To 5
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 7) = w
    Cells(6 + i, 8) = w / 5
  Next

End Sub

また切り取って空白となったところに、
Private Sub CommandButton1_Click()
  Dim i As Byte, j As Byte

  f1 '各生徒の合計点・平均点の計算

  '各教科等の合計点・平均点の計算
  For i = 1 To 7
    w = 0

       ・
       ・
       ・
End Sub
とタイピングして下さい。
同様にして、
 '各教科等の合計点・平均点の計算
  For i = 1 To 7
    w = 0
    For j = 1 To 40
      w = w + Cells(6 + j, 1 + i)
    Next
    Cells(47, 1 + i) = w
    Cells(48, 1 + i) = w / 40
  Next

以降もすべと独立させます。

すると、コードは最終的に
Private Sub CommandButton1_Click()

  f1 '各生徒の合計点・平均点の計算
  f2 '各教科等の合計点・平均点の計算
  
f3 '各生徒の合否判定
  f4 '各生徒の講評
  f5 '各生徒の最高点の算出
  f6 '各生徒の最低点の算出
  f7 '各教科と合計・平均の最高点の算出
  f8 '各教科と合計・平均の最低点の算出

End Sub

Sub f1()

  Dim i As Byte, j As Byte

  '生徒の合計点・平均点の計算
  For i = 1 To 40
    w = 0
    For j = 1 To 5
      w = w + Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 7) = w
    Cells(6 + i, 8) = w / 5
  Next

End Sub


Sub f2()

  Dim i As Byte, j As Byte

  '各教科等の合計点・平均点の計算
  For i = 1 To 7
    w = 0
    For j = 1 To 40
      w = w + Cells(6 + j, 1 + i)
    Next
    Cells(47, 1 + i) = w
    Cells(48, 1 + i) = w / 40
  Next

End Sub


Sub f3()

  Dim i As Byte, j As Byte

  '各生徒の合否判定 
  For i = 1 To 40
    If Cells(6 + i, 7) >= 300 Then
      Cells(6 + i, 11) = "合格"
    End If
    If Cells(6 + i, 7) < 300 Then
      Cells(6 + i, 11) = "不合格"
    End If
  Next

End Sub


Sub f4()

  Dim i As Byte, j As Byte

  '各生徒の講評
  For i = 1 To 40
    If Cells(6 + i, 7) >= 350 Then
      Cells(6 + i, 12) = "あなたはかなり優秀です。"
    End If
    If Cells(6 + i, 7) < 350 And Cells(6 + i, 7) >= 300 Then
      Cells(6 + i, 12) = "おめでとう。"
    End If
    If Cells(6 + i, 7) < 300 And Cells(6 + i, 7) >= 200 Then
      Cells(6 + i, 12) = "合格まで後一歩です。"
    End If
    If Cells(6 + i, 7) < 200 Then
      Cells(6 + i, 12) = "かなりのがんばりが必要です。"
    End If
  Next

End Sub


Sub f5()

  Dim i As Byte, j As Byte

  '各生徒の最高点の算出
  Dim max As Integer
  For i = 1 To 40
    max = 0
    For j = 1 To 5
      If Cells(6 + i, 1 + j) >= max Then max = Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 9) = max
  Next

End Sub


Sub f6()

  Dim i As Byte, j As Byte

  '各生徒の最低点の算出
  Dim min As Integer
  For i = 1 To 40
    min = 100
    For j = 1 To 5
      If Cells(6 + i, 1 + j) < min Then min = Cells(6 + i, 1 + j)
    Next
    Cells(6 + i, 10) = min
  Next

End Sub


Sub f7()

  Dim i As Byte, j As Byte

  '各教科と合計・平均の最高点の算出
  For i = 1 To 7
    max = 0
    For j = 1 To 40
      If Cells(6 + j, 1 + i) > max Then max = Cells(6 + j, 1 + i)
    Next
    Cells(49, 1 + i) = max
  Next

End Sub


Sub f8()

  Dim i As Byte, j As Byte

  '各教科と合計・平均の最低点の算出
  For i = 1 To 7
    min = 500
    For j = 1 To 40
      If Cells(6 + j, 1 + i) < min Then min = Cells(6 + j, 1 + i)
    Next
    Cells(50, 1 + i) = min
  Next

End Sub


となります。記述量は確かに増えました。
例えば、1回だった
  Dim i As Byte, j As Byte
は8回も出てきています。
しかし、全体に構造は
Private Sub CommandButton1_Click()

  f1 '各生徒の合計点・平均点の計算
  f2 '各教科等の合計点・平均点の計算
  
f3 '各生徒の合否判定
  f4 '各生徒の講評
  f5 '各生徒の最高点の算出
  f6 '各生徒の最低点の算出
  f7 '各教科と合計・平均の最高点の算出
  f8 '各教科と合計・平均の最低点の算出

End Sub
と大変見通しのよいものとなりました。
プログラムをわかりやすく書く、構造化プログラミング基本的考え方なのです。




第1話へ 第3話へ

004


vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ

数学研究室に戻る