回答:
非オブジェクトの戻り値型の場合、次のように値を関数の名前に割り当てる必要があります。
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/en-us/library/office/gg264233%28v=office.14%29.aspx
Range
たとえば)を返すときSet
は、通常のメソッドでオブジェクト変数を設定する場合と同じように使用する必要があることに注意してください。たとえば、「test」がRangeを返す関数だった場合、returnステートメントは次のようになりますset test = Range("A1")
。
set
に問題を引き起こす可能性があるからです。私はそれなしでそれを行うことに問題がありましたが、私が使用する場合、set
私はしません:)。
set test = Range("A1")
とまったく同じであるtest = Range("A1").Value
という範囲よりも、「テストは」変異体として定義されます。
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では、関数の最後に戻り値を設定しない場合、完全に同等のものは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
これが事実であるため、メソッド内で他の変数と同様に戻り変数を使用できることも知っておくと便利です。このような:
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
Variant
配列であり、配列を返すことが目的である場合はReDim test(1 to 100)
、エラーが発生します。また、基本的なタイプをそのように扱うことは可能Integers
ですが、やや慣用的なものと見なされます。コードが読みにくくなります。VBAプログラマは、関数名に割り当てられている行をスキャンして、関数の機能を理解します。関数名を通常の変数として使用すると、不必要にわかりにくくなります。
Exit Function
関連するかを説明してくれてありがとうreturn
ReDim test(1 to 100)
'test'が配列として宣言されていないからといって、エラーを引き起こさずにはいられません!他の理由はまったくありません!関数を配列として宣言することはできません。これをとして宣言し、Variant
この関数内で出力配列(動的または静的にすることができます)を構築し、test
この配列をtest
戻り値として( "=")に割り当てます。さらに操作ReDim
するには、たとえばingのように、戻り値を変数に代入する必要があります。たとえばDim x as Variant
、を呼び出してx = test
、その後にをx
作成test
します。