第6講 Functionプロシージャ
第7話 SubプロシージャとFunctionプロシージャのまとめ
皆さん、
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
と
Function g1(a As Byte)
Dim i As Integer
g1 = 0
For i = 1 To 5
g1 = g1 + Cells(6 + a, 1 + i)
Next
End Function
Sub f1()
Dim i As Byte, j As Byte
'生徒の合計点・平均点の計算
For i = 1 To 40
Cells(6 + i, 7) = g1(i)
Cells(6 + i, 8) = g1(i) / 5
Next
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 f1()
Dim i As Byte, j As Byte
'生徒の合計点・平均点の計算
For i = 1 To 40
Cells(6 + i, 7) = g1(i)
Cells(6 + i, 8) = g1(i) / 5
Next
End Sub
に注目しましょう。後半の方が短くなり、しかも1次元ループです。
前半は長く、2次元ループです。
Functionプロシージャg1は、横合計を求めることを任務とするプロシージャですから、
前半は、各生徒ごと(iは出席番号に対応)に合計処理をしていることが一目でわかります。
Function g1(a As Byte)
Dim i As Integer
g1 = 0
For i = 1 To 5
g1 = g1 + Cells(6 + a, 1 + i)
Next
End Function
Sub f1()
Dim i As Byte, j As Byte
'生徒の合計点・平均点の計算
For i = 1 To 40
Cells(6 + i, 7) = g1(i)
Cells(6 + i, 8) = g1(i) / 5
Next
End Sub
は、2次元を2つに分割することによって、それぞれが1次元になったわけです。
次元をそれぞれが分担することによって、プログラムの構造が大変見やすいものになっています。
わかりやすくなっただけでなく、2人で分業も可能になるのです。
合計処理の部分をAさんが、出席番号順処理をBさんが分担して受け持つことが可能になります。
さらに、プロシージャにしたことにより、
Function g3(a As Byte)
Dim i As Integer
g3 = 0
For i = 1 To 5
If g3 < Cells(6 + a, 1 + i) Then g3 = Cells(6 + a, 1 + i)
Next
End Function
Function g4(a As Byte)
Dim i As Integer
g4 = 500
For i = 1 To 5
If g4 > Cells(6 + a, 1 + i) Then g4 = Cells(6 + a, 1 + i)
Next
End Function
Function g5(a As Byte)
Dim i As Integer
g5 = 0
For i = 1 To 40
If g5 < Cells(6 + i, 1 + a) Then g5 = Cells(6 + i, 1 + a)
Next
End Function
Function g6(a As Byte)
Dim i As Integer
g6 = 500
For i = 1 To 40
If g6 > Cells(6 + i, 1 + a) Then g6 = Cells(6 + i, 1 + a)
Next
End Function
基本的な構造が同一のものを
Function g2(t1 As Byte, t2 As Byte, a As Byte)
Dim i As Integer
If t1 = 0 Then
g2 = 0
If t2 = 0 Then
For i = 1 To 5
If g2 < Cells(6 + a, 1 + i) Then g2 = Cells(6 + a, 1 + i)
Next
End If
If t2 = 1 Then
For i = 1 To 40
If g2 < Cells(6 + i, 1 + a) Then g2 = Cells(6 + i, 1 + a)
Next
End If
End If
If t1 = 1 Then
g2 = 500
If t2 = 0 Then
For i = 1 To 5
If g2 > Cells(6 + a, 1 + i) Then g2 = Cells(6 + a, 1 + i)
Next
End If
If t2 = 1 Then
For i = 1 To 40
If g2 > Cells(6 + i, 1 + a) Then g2 = Cells(6 + i, 1 + a)
Next
End If
End If
End Function
1つにまとめることが出来ました。行数(文字数)自体は、節約になっていませんが、
最高点の縦処理、最高点の横処理、最低点の縦処理、最低点の横処理の4つの処理が、最高点・最低点の処理にまとめられたことによって、
プログラム全体で見たときは、構造がより明確になっています。
最後に、プロシージャの意義をまとめます。
T プロシージャに分けることによって、それぞれのプログラムが短くなって分業が可能になる。
U プロシージャに分けることによって、それぞれのプログラムが短くなってわかりやすくなる。
V プロシージャに分けることによって、プログラムの構造がより単純になる。
例 4次元ループが2次元ループに落とされる。
W プロシージャの独立性により、構造化プログラミング(プラモデルの独立部品からプラモデルを組み立てるように、独立したプロシージャから全体を組み立てること)が可能になる。
尚、プロシージャの意義はこれに尽きるわけではありません。
後に学習するプロシージャの再帰的使用を使うと、プロシージャは爆発的な威力を発揮することになります。
vc++講義へ
vb講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座へ
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座へ
数学研究室に戻る