第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 プロシージャの独立性により、構造化プログラミング(プラモデルの独立部品からプラモデルを組み立てるように、独立したプロシージャから全体を組み立てること)が可能になる。

尚、プロシージャの意義はこれに尽きるわけではありません。
後に学習するプロシージャの再帰的使用を使うと、プロシージャは爆発的な威力を発揮することになります。




第6話へ 第7講第1話へ

004


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

数学研究室に戻る