第5講 Subプロシージャ

第3話 Subプロシージャの引数

第3話では、Subプロシージャの引数(ひきすう)について、学習します。
Private Sub CommandButton1_Click()

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

End Sub
メインとなるプロシージャにプロシージャf1などを組み込むことを、
プロシージャf1を呼び出すといいます。
プロシージャを呼び出すときに、値をプロシージャに引き渡すことも出来ます。
引き渡す値のことを引数といいます。
例えば、与えられた整数が偶数であるか奇数であるかを判定するプログラムを考えるとします。
次のようなシートを作ってください。
u001これは、B5に入力された整数が、偶数か奇数であるかを判定するプログラムです。
もちろん、コンピュータに判断させるまでもなく一目でわかってしまいますが、
わかりやすい一例であるとお考えください。
この次に、素数であるかの判定へと発展させます。
そして、偶数・奇数の判定をメインプロシージャであるPrivate Sub CommandButton1_Clickで行うのではなく、
Subプロシージャfで行わせたいのですが、この時に判定する整数をfに渡さなければなりません。
次のようにすると、整数を渡すことが出来ます。
Private Sub CommandButton1_Click()

  Dim n As Integer

  n = Cells(5, 2)
  f (n)

End Sub

Sub f(n As Integer)

  If n Mod 2 = 0 Then Cells(6, 2) = "偶数"
  If n Mod 2 = 1 Then Cells(6, 2) = "奇数"

End Sub
実行画面例
u002u003
(尚、B6は見栄えをよくするために配置を中央揃えにしてあります。やり方は、右クリック→セルの書式設定→配置→横位置を中央揃えに。
また、n Mod 2 とはnを2で割ったときの余りを計算する式です。2で割った余りが0なら偶数、1なら奇数ですね。)
つまり、f(引数)としたときには、
Subプロシージャは
Sub f(引数 As 型)と打ってエンターします。
u004


Sub f(n As Integer)

End Sub
とすることをプロシージャを宣言するといいますが、
プロシージャを宣言するとき、引き数名は呼び出す側のf(引数)と同名にする必要はありません。
例えば、
Private Sub CommandButton1_Click()

  Dim n As Integer

  n = Cells(5, 2)
  f (n)

End Sub

Sub f(a As Integer)

  If a Mod 2 = 0 Then Cells(6, 2) = "偶数"
  If a Mod 2 = 1 Then Cells(6, 2) = "奇数"

End Sub
でもよいのです。
u005
つまり、引き渡された側の中で引数名が統一されていれば、引き渡す側の引数名と引き渡される側の引き数名が異なっていてもよいのです。
もちろん、わかりやすさを優先するなら
u006
同名にしておく方がよいでしょうが、引き数名が異なっていてもよいということをご理解ください。

では、次の第3話ではfに素数判定を行わせます。
n mod 整数 を利用してください。
たとえば、47が素数であるかどうか判定するには、
2と3以上6以下の奇数3,5で割って、余りが0であるものが1つでもあれば、すべて余りが0でないなら素数です。
2で割る理由は、3以上の素数はすべて奇数であるからです。
つまり、2を除けば素数であるためには奇数であることが必要なのです。
2以外の素数は2で割ったときに余り1である必要があるのです。
ですから、2以外については偶数で割る必要はありません。
2で割ったときに余り1であれば、奇数であることが確定し、奇数は偶数では割り切れないことははじめから明らかだからです。
6以下は6の2乗=36、7の2乗=49ですから、7以上では47が割り切れないのは明らかです。

つまり、判定手順は
@ 2であるか調べます。2であれば、この時に素数の判定をします。
A 2でないときは、偶数か奇数かを判定します。偶数であれば、素数ではないの判定をします。
B 奇数であるときは、3以上与えられた整数の平方根未満の最大の整数まで奇数で割り算を実行します。
  余りが0のなった段階で素数でないを判定します。最後まで、余りが0でなければ素数と判定します。
ということになります。

判定がおりた段階で、以後の作業は不要になります。この時は、強制的にSubプロシージャを終了させます。
強制的に終了させるには、Exit Subとします。
だから、例えば@は
If n = 2 Then
  Cells(6, 2) = "偶数"
  Exit Sub
End If
とすればよいのです。
nの平方根はSqr(n)で得られます。

それでは皆さん素数判定マクロ
u007を作りましょう。




第2話へ 第4話へ

004


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

数学研究室に戻る