PeaceJetのブログ

金融系の社内エンジニアをやりながら、マーケティングやプランナーなども

【VBA】戻り値を変数に格納しなかったら、えらいめにあった。

戻り値をオブジェクトに格納しなかったら、えらいめにあった。

なんか、当たり前のことではあるのですが、ハマりました(笑)

以下のファンクション・プロシージャとサブ・プロシージャを同じモジュ―ルに配置して、実行してみて下さい。

Private Function returnValue()
    
    Dim i As Long
    For i = 0 To 1
        If i = 0 Then
            returnValue = True
        ElseIf i = 1 Then
            returnValue = False
        End If
    Next i
    
End Function
Public Sub returnTest()

If returnValue = True Then
    Debug.Print returnValue
ElseIf returnValue = False Then
    Debug.Print returnValue
End If

End Sub


イミディエイトウインドウには以下のように表示されそうのように思いますよね?
自分だけかな?

'True
'False

でも、実際はFalseしか表示されません。

ファンクション・プロシージャの中身が再評価されてしまうためです。

それでは、どのようにコード改変すれば上記のように出力されるのでしょうか?

Public Sub returnTest()

Select Case returnValue
    Case True
        Debug.Print returnValue
    Case False
        Debug.Print returnValue
End Select

End Sub

Select Case文を使うことで回避することが出来ます。

あるいは、何かの変数に格納してしまえばいいのです。