ユーザー定義関数(Function)の使い方

かばくん

Subプロシージャーを使った関数の使い方はわかってきました!
次は、値を返すFunctionプロシージャーですね。

へびせんせい

そうですね。実際に関数をつくるとなると、値を返すことが多いです。
Functionプロシージャーの使い方をみていきましょう。

Functionプロシージャーの使い方

Function関数を使う場合と使わない場合のイメージ

Functionプロシージャーは値を返す関数です。
呼び出し元のプロシージャー(関数)で必要な値を得るためにFunctionを呼び出すことになるので、基本的にはFunction単体では使われません。

Functionプロシージャーの基本事項

定義の方法

Function プロシージャー名(引数) As 型名
 (処理)
  プロシージャー名 = 値
End Function

Subプロシージャーと同様に、プロシージャー名は任意でよく、引数もあってもなくても良いです。
違う点は、Functionプロシージャー自体に型名を指定する必要があること。値を返すことになるので、その返す値の型をここで指定します。
ただし、変数と同じで型名は省略しても大丈夫です。その場合はVariant型として扱われます。
そして、処理の中で、プロシージャー名に返したい値を代入する必要があります。

呼び出し方

hensu = Functionプロシージャー名(引数)

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プロシージャーを呼び出すことでできます。

定義の方法

Function プロシージャー名(引数)
 (処理)
End Function

定義の方法は、ほとんど変わりません。
値を返さないため、Functionプロシージャーの型名は不要なことと、プロシージャー名に値を代入する必要はありません。

呼び出し方

Call 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プロシージャーで値を返さないのは違和感をもつ人もいるでしょう。
結局このあたりは、開発者の好みにもよるので、自分の中で一定の基準があれば十分です。


Functionプロシージャーの練習問題

へびせんせい

前回の練習問題で作成したGetMaxValue関数をFunctionプロシージャーに書き換えなさい。
GetMaxValue関数はLong型の関数で定義し、main関数に値を返したのちに、main関数で表示させなさい。

解答はコチラ

Excelを開いて、コードを確認してください

Download