かばくん
Subプロシージャーを使った関数の使い方はわかってきました!
次は、値を返すFunctionプロシージャーですね。
へびせんせい
そうですね。実際に関数をつくるとなると、値を返すことが多いです。
Functionプロシージャーの使い方をみていきましょう。
Contents
Functionプロシージャーの使い方
Functionプロシージャーは値を返す関数です。
呼び出し元のプロシージャー(関数)で必要な値を得るためにFunctionを呼び出すことになるので、基本的にはFunction単体では使われません。
Functionプロシージャーの基本事項
定義の方法
(処理)
プロシージャー名 = 値
End Function
Subプロシージャーと同様に、プロシージャー名は任意でよく、引数もあってもなくても良いです。
違う点は、Functionプロシージャー自体に型名を指定する必要があること。値を返すことになるので、その返す値の型をここで指定します。
ただし、変数と同じで型名は省略しても大丈夫です。その場合はVariant型として扱われます。
そして、処理の中で、プロシージャー名に返したい値を代入する必要があります。
呼び出し方
Functionプロシージャーと同じ型の変数hensuに、関数を代入するような形で呼び出します。
そうすると、Functionプロシージャー内の処理の最後にプロシージャー名に代入された値がhensuに返ります。
実際のコードを見たほうがわかりやすいでしょう。
コード例
Sub main()
Dim small_num As Long
small_num = GetSmallerNumber(10, 2000)
MsgBox (small_num & "のほうが小さい数字です")
End Sub
Function GetSmallerNumber(num1 As Long, num2 As Long) As Long
Dim tmp As Long
If num1 < num2 Then
tmp = num1
Else
tmp = num2
End If
GetSmallerNumber = tmp
End Function
Functionプロシージャー名GetSmallerNumberは、2つLong型の引数をもち、その引数の小さい方を返す関数です。
main関数でsmall_numという変数に、小さい数字が返る(代入される)ことになります。
値を返さないFunctionプロシージャー
値を返さないFunctionプロシージャーの基本事項
実は、Functionプロシージャーでも値を返さないようにすることは可能です。
Callを使って、Functionプロシージャーを呼び出すことでできます。
定義の方法
(処理)
End Function
定義の方法は、ほとんど変わりません。
値を返さないため、Functionプロシージャーの型名は不要なことと、プロシージャー名に値を代入する必要はありません。
呼び出し方
このとき、Functionプロシージャーには返り値がないため、処理中にFunctionプロシージャ名に値を代入する必要はありません。
コード例
Sub main()
Call test_func
End Sub
Function test_func()
MsgBox "値を返さないFunction関数です"
End Function
Subプロシージャーとまったく同じ方法で記載できます。
ユーザー定義関数をつくるときは、Functionだけでも良い!?
値を返さないときはSubプロシージャーで、値を返すときはFunctionプロシージャーでした。
しかし、Functionプロシージャーでも値を返さないように設定できました。
そのため、「ユーザー定義関数はすべてFunctionを使って、呼び出し元のメイン関数をSubプロシージャーで設計する」というのは、ぜんぜんありだと思います。
その方がmain関数とユーザー関数の区別がわかりやすいとも言えます。
しかし、人によってはFunctionプロシージャーで値を返さないのは違和感をもつ人もいるでしょう。
結局このあたりは、開発者の好みにもよるので、自分の中で一定の基準があれば十分です。
Functionプロシージャーの練習問題
へびせんせい
前回の練習問題で作成したGetMaxValue関数をFunctionプロシージャーに書き換えなさい。
GetMaxValue関数はLong型の関数で定義し、main関数に値を返したのちに、main関数で表示させなさい。