関数から結果を返す方法は?
例えば:
Public Function test() As Integer
return 1
End Function
これによりコンパイルエラーが発生します。
この関数に整数を返させるにはどうすればいいですか?
非オブジェクト戻り型の場合は、次のように値を関数の名前に割り当てる必要があります。
Public Function test() As Integer
test = 1
End Function
使用例
Dim i As Integer
i = test()
関数がオブジェクト型を返す場合は、次のようにSet
キーワードを使用する必要があります。
Public Function testRange() As Range
Set testRange = Range("A1")
End Function
使用例
Dim r As Range
Set r = testRange()
関数名に戻り値を割り当てても、関数の実行は終了しません。関数を終了したい場合は、明示的にExit Function
を指定する必要があります。例えば:
Function test(ByVal justReturnOne As Boolean) As Integer
If justReturnOne Then
test = 1
Exit Function
End If
'more code...
test = 2
End Function
ドキュメント: http://msdn.Microsoft.com/ja-jp/library/office/gg264233%28v=office.14%29.aspx
VBA関数は、関数名自体を一種の変数として扱います。それで、 "return
"ステートメントを使う代わりに、あなたはただ言う:
test = 1
ただし、これは関数から外れないことに注意してください。この文の後のコードも実行されます。したがって、test
に異なる値を代入する代入文を多数用意することができ、関数の終わりに達したときの値がなんであれ、それが返されます。
戻り値を関数名に設定するだけでは、正確にはJava(または他の)のreturn
ステートメントと同じではありません。これは、Javaではreturn
が関数を終了するためです。
public int test(int x) {
if (x == 1) {
return 1; // exits immediately
}
// still here? return 0 as default.
return 0;
}
VBでは、 exact に相当する行は2行関数の最後に戻り値を設定していない場合になります。したがって、VBでは、正確な推論は次のようになります。
Public Function test(ByVal x As Integer) As Integer
If x = 1 Then
test = 1 ' does not exit immediately. You must manually terminate...
Exit Function ' to exit
End If
' Still here? return 0 as default.
test = 0
' no need for an Exit Function because we're about to exit anyway.
End Function
このような場合があるので、メソッド内の他の変数と同じようにreturn変数を使用できることを知っておくのもいいでしょう。このような:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test <> 1 Then ' Test the currently set return value
test = 0 ' Reset the return value to a *new* value
End If
End Function
あるいは、戻り変数動作の極端な例(実際のコーディング方法の必ずしも良い例とは限りません) - 夜間にあなたを維持するもの:
Public Function test(ByVal x As Integer) As Integer
test = x ' <-- set the return value
If test > 0 Then
' RECURSIVE CALL...WITH THE RETURN VALUE AS AN ARGUMENT,
' AND THE RESULT RESETTING THE RETURN VALUE.
test = test(test - 1)
End If
End Function