web-dev-qa-db-ja.com

VBA関数から結果を返す方法

関数から結果を返す方法は?

例えば:

Public Function test() As Integer
    return 1
End Function

これによりコンパイルエラーが発生します。

この関数に整数を返させるにはどうすればいいですか?

238
Mike

非オブジェクト戻り型の場合は、次のように値を関数の名前に割り当てる必要があります。

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

374
Dan

VBA関数は、関数名自体を一種の変数として扱います。それで、 "return"ステートメントを使う代わりに、あなたはただ言う:

test = 1

ただし、これは関数から外れないことに注意してください。この文の後のコードも実行されます。したがって、testに異なる値を代入する代入文を多数用意することができ、関数の終わりに達したときの値がなんであれ、それが返されます。

81
froadie

戻り値を関数名に設定するだけでは、正確には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
32
LimaNightHawk