VBAで三項演算子の代わりにif Else文を使う方法(IIF関数は避けよう)

VBAには三項演算子がありません。

三項演算子は次のようなものです。aがtrueならbが、aがfalseならcがxに代入されます。

int x = a ? b : c;

三項演算子と似た役割を担うものとしてIIF関数があるのですが、三項演算子と違ってあまり嬉しくない仕様となっています。
すでに知ってる方も多いかもしれませんが、その仕様についても最後に紹介します。

でも、三項演算子は無いのかと諦める必要はありません。

シンプルなIf Else文を書けば、VBAでも三項演算子と同じような動作をさせることができます。

しかも、If Else文なので誰でも読むことができます。

三項演算子の代わりにIf Else文を使う方法(VBA)

If文は1行で書く場合は、End Ifを書く必要がありません。また、改行せずにElseを繋げることができます。
つまり、次のように1行で繋げて書くことができるのです。

If a Then x= b Else x= c

三項演算子と比べても遜色のない短いコードではないでしょうか。

参考にサンプルコードも記載します。

aがtrueならばx=b, aがfalseならばx=cとなることが確認できます。

Sub Sample()

    Dim a As Boolean: a = True
    Dim x As Integer
    Const b = 1, c = 2
    
    If a Then x = b Else x = c
    Debug.Print x

End Sub

IIf関数の困った仕様

x=IIf(a, b, c)

IIf関数はこのように書きます。
aがTrueの場合はbを返し、aがFalseの場合はcを返します。三項演算子とかなり似ていますね。

しかし、1つ問題があります。aがTrueの場合であってもcを評価してしまうことです。
なにがまずいのか簡単なプログラムで確認してみましょう。

Sub IIfSample()
    Const b = 1, c = 0
    Dim x As Integer
    
    'c=0なら0を返したい。c<>0ならb/cを返したい。
    x = IIf(c = 0, 0, b / c)

End Sub

IIf関数を用いて、cが0の場合には0を、0でない場合にはb/cの結果を返そうとしています。
しかし、このプログラムを実行すると「0で除算しました」の実行時エラーが起こります。

c=0がTrueなので、IIf関数は0を返すだけだと思うかもしれません。

しかし、IIf関数はTrueであってもFalseであっても、0とb/cの両方を評価します。
そのため、b/cを評価した時に1/0となるため、「0で除算しました」のエラーが発生したわけです。

このようにIIf関数を使うと三項演算子と違い、両方の評価をしてしまいます。
この観点からもVBAではIf Else文を用いた書き方が有効です。

他の「VBA」の記事はこちらからどうぞ