このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

【VBA】三項演算子の代わりはIIF関数でなくIfElse文を使おう

2021年8月17日

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

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

int x = a ? b : c;

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

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

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

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

VBAが難しいと感じたら
自分で作るのが難しいと感じたらご相談ください。
ココナラにて、VBAの作成を受け付けています。
ご相談はこちらから

三項演算子の代わりに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が難しいと感じたら
自分で作るのが難しいと感じたらご相談ください。
ココナラにて、VBAの作成を受け付けています。
ご相談はこちらから