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


277

関数から結果を返すにはどうすればよいですか?

例えば:

Public Function test() As Integer
    return 1
End Function

これはコンパイルエラーになります。

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


回答:


429

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

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


32
完全を期すために、オブジェクト(Rangeたとえば)を返すときSetは、通常のメソッドでオブジェクト変数を設定する場合と同じように使用する必要があることに注意してください。たとえば、「test」がRangeを返す関数だった場合、returnステートメントは次のようになりますset test = Range("A1")
Jay Carr

なぜそれは@JayCarrですか?
PsychoData 2014

4
@PsychoData-それが一般的にオブジェクト変数を設定する方法であり、それを行わずsetに問題を引き起こす可能性があるからです。私はそれなしでそれを行うことに問題がありましたが、私が使用する場合、set私はしません:)。
Jay Carr、

1
別のVBA関数またはSubから呼び出すのと比較して、スプレッドシートから呼び出すときの関数の動作が異なることにも言及する価値があると思います。
Doug Jenkins

2
VBA内で呼び出されると、関数は、範囲オブジェクトを返しますが、ワークシートから呼び出されたときに、それだけで値を返しますので、set test = Range("A1")とまったく同じであるtest = Range("A1").Valueという範囲よりも、「テストは」変異体として定義されます。
Doug Jenkins

86

VBA関数は、関数名自体を一種の変数として扱います。したがって、「return」ステートメントを使用する代わりに、次のように言うだけです。

test = 1

ただし、これが関数から抜け出すわけではないことに注意してください。このステートメントの後のコードも実行されます。したがって、さまざまな値をtestに割り当てる多くの割り当てステートメントを持つことができ、関数の最後に到達したときの値が何であれ、返される値になります。


実際、追加の情報を使用して質問に明確に回答しました(これは、VBAの初心者から別の質問につながる可能性があります)。良い仕事を続ける
Adarsha

申し訳ありませんが、私が最初に持っていた私の答えと同じことを答えたようですが、関数から抜け出さないという事実を追加しているだけです。それはいい追加です、私はそれがコメントとしてより適切であると思いました。適切なエチケットが何であるかはわかりませんが、それだけに反対投票するのは少し失礼だったと思います。これは良い答えですが、元に戻すことはできません。
ダン

41

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

2
「メソッド内で他の変数と同じように戻り変数を使用できることも知っています」はほとんどの場合真ですが、たとえば、戻り値の型がVariant配列であり、配列を返すことが目的である場合はReDim test(1 to 100)、エラーが発生します。また、基本的なタイプをそのように扱うこと可能Integersですが、やや慣用的なものと見なされます。コードが読みにくくなります。VBAプログラマは、関数名に割り当てられている行をスキャンして、関数の機能を理解します。関数名を通常の変数として使用すると、不必要にわかりにくくなります。
John Coleman

@JohnColeman、両方の点で完全に同意します。最後の例が推奨される方法論の1つであってはなりません。しかし、トピックの質問は変数を返す方法に関するものなので、これはVBの戻り結果を完全に説明する試みであり、ひいてはそれらがどのように機能するかを示しています。確かに最後のケースは推奨事項ではありません。(私は確かにそれを例以上にコーディングすることはしません。)したがって、あなたの主張はよく理解されており、良い追加です。ありがとうございました。
LimaNightHawk 16

これ小さめの関数に役立ち、どのVBAプログラマーも知っておくべきことなので、言及しても問題ありませんでした。私は警告が含まれるべきだと思いました。
John Coleman

どのようにExit Function関連するかを説明してくれてありがとうreturn
オースティンD

@JohnColeman、明らかに、ReDim test(1 to 100)'test'が配列として宣言されていないからといって、エラーを引き起こさずにはいられません!他の理由はまったくありません!関数を配列として宣言することはできません。これをとして宣言し、Variantこの関数内で出力配列(動的または静的にすることができます)を構築し、testこの配列をtest戻り値として( "=")に割り当てます。さらに操作ReDimするには、たとえばingのように、戻り値を変数に代入する必要があります。たとえばDim x as Variant、を呼び出してx = test、その後にをx作成testします。
ジーン

-6

コード変数に格納戻り値以下retValとその後MsgBox:値を表示するために使用することができます

Dim retVal As Integer
retVal = test()
Msgbox retVal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.