【EXCEL VBA】三項演算子IIfの注意点

他言語でも実装されている三項演算子ですがVBAにも実装されています。ただし1点だけ注意しなければならない点がありますので紹介します。 特に他言語経験者は要注意です。

サンプルプログラム

注意点が見えやすいようにIf-ElseのパタンとIIfのパタンを書きました。If-Elseのパタンについては出力内容を見ても、まぁそうなるよねという内容です。しかしIIfのパタンについてはどうでしょうか?なぜげfuga関数もコールされています。これがVBAの三項演算子IIfで中止しなければならない点です。

IIfの判定結果については正しいものが返却されますが(今回の場合は”偶数”という文字列)、評価については両方の関数について行われます。hoge、fuga両方の関数がコールされるということです。

巨大なプログラムになると気づきにくいバグとなるので、可能ならばIIf関数は利用しないほうが良いと思います。

Function isEven(i)          '偶数判定関数
    If i Mod 2 = 0 Then
        isEven = True
    Else
        isEven = False
    End If
End Function

Function hoge()
    Debug.Print "hogeがCallされました"
    hoge = "偶数"
End Function


Function fuga()
    Debug.Print "fugaがCallされました"
    fuga = "奇数"
End Function


Sub sample()
    Debug.Print "IF Else での判定"
    ' IF Else での判定
    If isEven(2) Then
        Debug.Print hoge
    Else
        Debug.Print fuga
    End If
    
    Debug.Print "IFF での判定"
    ' IFF での判定
    Debug.Print IIf(isEven(2), hoge, fuga)
   
End Sub

出力内容

IF Else での判定
hogeがCallされました
偶数

IFF での判定
hogeがCallされました
fugaがCallされました
偶数