【VBA】三項演算子の代わりはIIF関数でなくIfElse文を使おう
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文を用いた書き方が有効です。