第10講 Sub プロシージャと Function プロシージャの呼び出し
第5話 Function プロシージャ

Subプロシージャは引数だけで、戻り値を持っていませんでした。
それに対してFunction プロシージャは戻り値を持ちます。
これは数学の関数と同じです。
例として、f(x)=3xー1
をとりましょう。
xに2を入れるとf(x)は5の値を返します。
つまりf(2)=5です。
引数2に対して戻り値として5を返すのです。
Functionプロシージャも同じで引数と戻り値を持ちます。
だから、Function プロシージャを関数とも言います。

さて、それでは戻り値を持つFunctionプロシージャを用いて、
1から10,000までの素数をすべて表示させ、
その個数を求めるプログラムを考えましょう。
Functionプロシージャで素数の判定をし、
素数の場合は戻り値1、
素数でない場合は戻り値0
を返すようにして戻り値が1のときのみエクセルのシートに表示させ、
同時に表示させるようにしましょう。

Functionプロシージャ名をsosuuhanteiとしましょう。
Functionプロシージャsosuuhanteiの作り方は、
Subプロシージャの作り方と同じです。
Private Sub CommandButton1_Click()
   ・
   ・
   ・
End Sub
の外側でFunction sosuuhantei(g as integer)と打って、
エンターキーを押せばよいのです。
そうすると自動的にFunctionプロシージャ
Function sosuuhantei(g as integer)

End Function
ができあがります。
素数の判定は、2以上の整数については
対象の整数を2以上でその数の半分以下のすべて整数で対象の整数を割って、
すべて割り切れなけれがよいのです。
逆に言うと、1つでも割り切れれば素数ではないとなります。
つまり次のようにプログラムすればよいのです。
Function sosuuhantei(g As Integer)

  Dim i As Integer, h As Integer, o As Integer

  sosuuhantei = 1
  o = Int(g / 2)

  For i = 2 To o
    If g Mod i = 0 Then
      sosuuhantei = 0
      Exit For
    End If
  Next

End Function
上のプログラム一見すると2も素数でないと判定してしまいそうですが、
oは1なので
  For i = 2 To o
    If g Mod i = 0 Then
      sosuuhantei = 0
      Exit For
    End If
  Next
の部分は実行されませんので、sosuuhantei が0になる心配はありません。

実は、このプログラム少し無駄があります。
なぜなら2以外は素数は奇数ですから
3以上については奇数のみを判定すればよいのです。
さらに、割る数にしても判定しようとしている整数の半分まで調べる必要はありません。
対象の整数のルートまでで十分です。
例えば、9ならルート9=3までで十分です。
なぜなら、ルート9で割った商もルート9だからです。
そこで改良して

Private Sub CommandButton1_Click()

  Dim i As Integer
  Dim h As Integer
  Dim sousuu As Integer
  Dim sousuua As Integer
  Dim sousuus As Integer

  sousuu = 1
  Cells(5, 1) = "1から10,000までの素数個数="
  Cells(6, 1) = 2

  For i = 3 To 10000 Step 2
    h = sosuuhantei(i)
    If h = 1 Then
      sousuua = sousuu Mod 20
      sousuus = Int(sousuu / 20)
      Cells(6 + sousuus, 1 + sousuua) = i
      sousuu = sousuu + 1
      Cells(5, 6) = sousuu
    End If
  Next

End Sub

Function sosuuhantei(g As Integer)

Dim i As Integer, h As Integer, o As Integer

  sosuuhantei = 1
  o = Int(Sqr(g))
  For i = 3 To o Step 2
    If g Mod i = 0 Then
      sosuuhantei = 0
      Exit For
    End If
  Next

End Function


素数判定プログラム

第4話へ  第6話へ