第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()と打ってリターンすればよいのです。
すると自動的に
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話へ
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る