第7講 ファンクションプロシージャの学習
第3話 第6講第5話のプログラムをファンクションプロシージャで実現する 
Private Sub CommandButton1_Click()
  CommandButton2_Click '社員CommandButton2_Clickに仕事を依頼
  Dim a As Byte, b As Byte, c As Byte
  a = Cells(3, 3)
  b = Cells(4, 3)
  c = Cells(5, 3)
  Cells(6, 2) = f(a, b, c) '社員fに仕事を依頼した
  Cells(7, 2) = "です。"
End Sub
Function f(a As Byte, l As Byte, d As Byte)
  Dim w As Integer, i As Byte
  w = 0 'wを0に初期化
  For i = a To l Step d
    w = w + i
  Next
  f = w
End Function
Private Sub CommandButton2_Click()
  Rows("6:2000").Select
  Selection.ClearContents
  Cells(1, 1).Select
End Sub
参考ダウンロード添付ファイル
実行画面例
001
(赤い囲いを加えてみました。)

Function f(a As Byte, l As Byte, d As Byte)
  Dim w As Integer, i As Byte
  w = 0 'wを0に初期化
  For i = a To l Step d
    w = w + i
  Next
  f = w
End Function
の部分は、
Function f(a As Byte, l As Byte, d As Byte)
  Dim i As Byte
  f = 0 'fを0に初期化
  For i = a To l Step d
    f = f + i
  Next
End Function
としても大丈夫ですが、
Function f(a As Byte, l As Byte, d As Byte)
  Dim
f As Integer, i As Byte
  f = 0 'wを0に初期化
  For i = a To l Step d
    f = f + i
  Next
End Function
とするとエラーします。
実際に変更して、実行ボタンを押すと、
011
となり、さらにOKを押すと、
012
とエラー原因が示されます。
同じ適用範囲内で宣言が重複しているとは、
1行目
Function f(a As Byte, l As Byte, d As Byte)
を書いた段階で、

fは変数として宣言されています。
もちろんこの段階では、
返す値が整数型なのか文字型なのか浮動小数点型なのかなどはわからないので、
おそらく万能型(Variant型)として宣言されているのでしょう。
C言語においては、
int f(int a,int l,int d)
などとfが何の型を返すのかを指定しないとエラーするとは対照的です。
C言語では万能型の変数を認めていないので、必ず型を指定しなければならないのです。
VBAでは万能型の変数を認めているので、
ファンクションプロシージャのfがどういう型の変数を返すのかを、
指定する必要がないということだと思います。

結局、宣言の重複とは、変数が2重に宣言されているという意味です。
1行目
Function f(a As Byte, l As Byte, d As Byte)
を書いた段階で、fは万能型変数として宣言されているのに、

2行目
  Dim f As Integer, i As Byte
で今度はfを整数型として宣言しているわけで、
2重に宣言されることになりますね。

さて、次の課題です。ファンクションプロシージャfに今度は
1×2×3×・・・×n
の計算をすなわちn!を求めさせてみましょう。
引数として送るのはnです。
013




第2話へ 第4話へ

トップへ