VBAには三項演算子はないが代替関数がある

VBAにも他の言語と同様に三項演算子があります。正確には演算子ではなくIIf関数で実現しています。

ところが認知度がとても低いようです。

その理由の1つに書籍に書いてあることがほとんど無いのがあると思われます。では、なぜ書籍には書かれていないのかと言うと、ひどいバグが実装されているためではないか思われます。

バグの詳細は後述しています。

他の言語であれば普通は三項演算子について本に書いてありますからね。書いていないということはバグが原因と考えてよいと思います。

構文

Function IIf(Expression, TruePart, FalsePart)

Expression Boolean型の結果を返す条件文を指定します。
TruePart Expressionの結果がTrueの場合にIIf関数の戻り値になります。関数を設定することも可能です。
FalsePart Expressionの結果がFalseの場合にIIf関数の戻り値になります。関数を設定することも可能です。

三項演算子(IIf関数)の書き方

以下のコードは通常のIf文と、同じ内容を三項演算子のIIf関数で書いたコードです。

通常のIf文のコード

出力結果

条件に一致
条件に不一致

三項演算子(IIf関数)のコード

出力結果

条件に一致
条件に不一致


三項演算子(IIf関数)のバグ

VBAの三項演算子(IIf関数)にはバグがあります。

https://docs.microsoft.com/ja-jp/office/vba/language/reference/user-interface-help/iif-function

上記ページの注釈に
「IIf では、 truepart または falsepart のいずれか一方だけが返されますが、評価は両方の引数に対して行われます。 このため、予期しない結果が起きることがあります。 たとえば、 falsepart を評価した結果 0 による除算エラーが発生する場合は、 expr が True であってもエラーが発生します。」
とあります。

仕様のように書いてますが、明らかに実装上のバグです。

以下はバグが発生するソースです。

出力結果
0(0 > 1の条件に一致しないため出力してほしくないが出力される)
1

これ、何がバグなのかというと、IIf関数の第二引数と第三引数が関数の呼び出しなどの演算処理が行われる形式になっている場合、第一引数である条件文の結果に関わらず、第二引数と第三引数の両方が実行されてしまいます。上のコードであれば0 > 1の条件に一致するのは第三引数のため、本来であれば第三引数の「testMethond(1)」だけが処理されればいいのですが、第二引数の「testMethod(0)」も処理されてしまいます。

ひどいバグです。条件文の結果に関わらず、第二引数と第三引数が処理されています。

一体何のための条件文なんでしょうか。

結論。三項演算子(IIf関数)は使わないようにしましょう

他の言語もそうですが、やはり三項演算子(IIf関数)はおすすめしません。

VBAのIIfに至っては認知度はかなり低いと思われるため他人がメンテすることがあれば大変ですし、直観的にわかりにくいため、誤読やコーディングミスにつながる恐れがあります。

そして、それ以前に言語としてバグってます。