はじめに
VBAのプロシージャには、SubとFunctionがあります。
両者とも引数を持つ事ができ、Functionは返り値を持つ事ができます。
引数とは、プロシージャに与える値の事で、インプットにあたります。
返り値とは、プロシージャが吐き出す値の事で、アウトプットです。
※返り値は「戻り値」と言うこともあります。
引数や返り値を持つプロシージャは、通常外部から呼び出して使う事になり、単独で使う事はありません。
プロシージャを部品化して使いたい場合などでは、引数や返り値を使う事になります。
引数の使い方
引数を指定したい場合は、引数の変数名と変数型を、カンマで区切って書いていきます。
変数型を省略するとバリアント型を指定したのと同じになります。
Functionの場合も書き方は同じです。
Sub プロシージャ名 (引数1 As 変数型, 引数2 As 変数型)
…
End Sub
例題プログラム
次のプログラムは a, b 2つの引数を与えると、大きい方をイミディエイトウィンドウに表示します。
Sub myMax(a As Long, b As Long)
If a > b Then
Debug.Print a
ElseIf a = b Then
Debug.Print "等しい"
Else
Debug.Print b
End If
End Sub
上のプログラムを実行するのは、引数を与える必要があるので実行用のプログラムが必要になります。
引数のあるプログラムを実行するには、2通りの書き方があります。
Sub testCode()
myMax 1, 2
End Sub
Sub testCode2()
Call myMax(1, 2)
End Sub
どちらを使っても構いません。
返り値の使い方
返り値を使いたい場合は、Subは使えませんのでFunctionになります。
返り値は引数の()の後に、返したい変数型を書きます。
プロシージャの中で、「プロシージャ名 = 返り値」という書式で値を返します。
Function プロシージャ名 (引数1 As 変数型, 引数2 As 変数型) As 返り値変数型
….
プロシージャ名 = 返り値
End Function
例題プログラム
次のプログラムは a, b 2つの引数を与えた時、a が大きい場合は 1 を、b が大きい場合は -1 を、等しい場合は 0 を返します。
Function getMyMax(a As Long, b As Long) As Long
Dim result As Long
result = 0
If a > b Then
result = 1
Else
result = -1
End If
getMyMax = result
End Function
上記のプログラムを実行するためのプログラムは以下のようになります。
返り値を返さない場合と異なり、書き方は1種類だけです。
Sub testCode3()
Dim a As Long
Dim b As Long
a = 3
b = 2
If getMyMax(a, b) > 0 Then
Debug.Print "aの方が大きい"
End If
End Sub
Functionの定番の書き方
例題の getMyMax は以下のように result を使わずに書く方法もありますが、良い方法とは言えません。
Function getMyMax(a As Long, b As Long) As Long
If a > b Then
getMyMax = 1
ElseIf b > a Then
getMyMax = -1
Else
getMyMax = 0
End If
End Function
この場合、プロシージャ名を変更しようとした時、4カ所全てを書き変える事になります。
もし書き換えを忘れた場合は、エラーとなります。
値を返す「プロシージャ名 = 返り値」という部分は1つにした方が、見通しも良くなり改造や変更する時に便利です。
Function プロシージャ名 引数1 As 変数型, 引数2 As 変数型) As 返り値変数型
Dim 返り値用変数 As 返り値と同じ変数型
返り値用変数 = デフォルト値
….
….
プロシージャ名 = 返り値用変数
End Function
返り値用変数のデフォルト値は、初期値をセットするようにします。
数値型であれば 0 、ブール型であれば False などをセットしておくのが一般的です。
まとめ
プログラムに慣れてくると、処理ごとにプロシージャを分割して呼び出して使いたい場面が出てきます。
そのような時、引数や返り値を設定する事が必須になるでしょう。
「Functionの定番の書き方」で紹介した方法は、他ではあまり語られませんが便利な書き方なので是非マスターしていただければと思います。
以下に詳しく解説していますので、参照してみてください。
・Functionお決まりの書き方