wanna.jp VBAリファレンス
Top > VBA関数リファレンス > VBA IIf関数で実現!簡易ツールを爆速化する1行条件分岐の極意と落とし穴【三項演算子】

VBA IIf関数で実現!簡易ツールを爆速化する1行条件分岐の極意と落とし穴【三項演算子】

VBAでちょっとした業務改善ツールや、サクッと動くマクロを作るとき、コードの可読性を保ちつつ、もっとスマートに記述したいと思ったことはありませんか? 特に、簡単な条件分岐を1行で済ませられれば、コードが見やすくなり、開発速度も格段に上がりますよね。 そんな時に非常に強力な味方となるのが、今回ご紹介するIIf関数です。 VBAにおける「三項演算子」のような役割を果たし、コードの行数を劇的に減らし、可読性を高める強力なツールとなります。 しかし、その便利さの裏には知っておくべき「落とし穴」も存在します。 この記事では、IIf関数の実用的な使い方から、注意すべき点、そしてその回避策まで、VBAエキスパートの視点から徹底解説します。

【コピペOK】IIf関数で1行条件分岐の実践コード

まずは、IIf関数を使った基本的な条件分岐の例を見てみましょう。 ある変数の値を判定し、その結果に応じて異なる文字列を返す、非常にシンプルなケースです。 このコードをコピーして、ご自身のVBA環境でぜひ実行してみてください。


Sub Sample_IIf_Basic()
    ' 判定対象となる変数を定義
    Dim valueToCheck As Variant
    valueToCheck = 10 ' ここを色々な値(例: -5, 0, 100)に変えて試してみましょう

    ' IIf関数を使った1行での条件分岐
    ' 構文: IIf(条件式, 真の場合の値, 偽の場合の値)
    Dim resultString As String
    resultString = IIf(valueToCheck > 0, "値は正の数です (OK)", "値はゼロ以下です (NG)")

    ' 結果をメッセージボックスで表示
    MsgBox "判定結果: " & resultString, vbInformation, "IIf関数 基本サンプル"

    ' 別の実用例: セルに直接結果を書き込む
    ' 例えば、シート1のA1セルの値が100より大きいかどうかで判定
    Dim targetCell As Range
    Set targetCell = ThisWorkbook.Sheets(1).Range("A1")
    
    ' テスト用にA1セルに値をセット
    targetCell.Value = 120 ' ここを様々な値に変えて試してみましょう (例: 50, 100, 150)

    ' IIf関数で判定し、結果を別のセル(B1)に書き込む
    ThisWorkbook.Sheets(1).Range("B1").Value = IIf(targetCell.Value > 100, "Excellent!", "Good")
    
    MsgBox "セルA1(" & targetCell.Value & ")の評価結果がセルB1に書き込まれました: " & ThisWorkbook.Sheets(1).Range("B1").Value, vbInformation, "IIf関数 セル書き込み例"

End Sub
    

このように、IIf(条件式, 真の場合の値, 偽の場合の値)というシンプルな構文で、条件に応じた結果を1行で取得し、変数への代入やセルへの書き込みなどに活用できます。コードが非常にスッキリしますね!

【重要】IIf関数の知られざる落とし穴と確実な回避策

IIf関数は非常に便利で、VBAコードを簡潔にする強力なツールですが、一つだけ非常に重要な「落とし穴」があります。 それは、真偽に関わらず「真の場合の値」と「偽の場合の値」の両方の式を評価するという特性です。 VBA以外の言語における多くの三項演算子とは異なる動作をするため、注意が必要です。

具体的なエラー例 (0除算)

以下のコードは、myDivisorが0の場合に実行するとエラーになります。 本来であれば、myDivisor > 0Falseになるため、「割れません」という文字列が返されることを期待しますが、実際には「真の場合の値」である10 / myDivisorも評価され、0除算エラーが発生します。


Sub Sample_IIf_Error_DivisionByZero()
    Dim myDivisor As Integer
    myDivisor = 0 ' ここを0にするとエラーが発生します!

    Dim result As Variant

    ' エラーが発生するIIf関数の使用例
    ' IIfの第一引数(myDivisor > 0)がFalseになるが、
    ' 第二引数の (10 / myDivisor) も評価されてゼロ除算エラーが発生する!
    On Error Resume Next ' エラーを一時的に無視する設定(デバッグ用)
    result = IIf(myDivisor > 0, 10 / myDivisor, "割れません")
    On Error GoTo 0      ' エラー処理をリセット

    If Err.Number <> 0 Then
        MsgBox "エラーが発生しました: " & Err.Description & vbCrLf & _
               "これはIIf関数の「両方の引数を評価する」特性によるものです。", vbCritical
        Err.Clear
    Else
        MsgBox "結果: " & result, vbInformation
    End If
End Sub
    

IIf関数の落とし穴を確実に回避する方法

この問題を回避するには、以下のいずれかの方法を取ることを強くお勧めします。

1. 安全な If...Then...Else ステートメントを使用する

最も確実で推奨される方法は、VBAの基本的な条件分岐であるIf...Then...Elseステートメントに戻すことです。 これならば、条件が真の場合のみ真のコードブロックが、偽の場合のみ偽のコードブロックが評価・実行されます。


Sub Avoid_IIf_Error_With_IfThenElse()
    Dim myDivisor As Integer
    myDivisor = 0 ' 0に設定してもエラーは発生しません

    Dim result As Variant
    If myDivisor > 0 Then
        ' myDivisorが0の場合、このブロックは実行されない
        result = 10 / myDivisor
    Else
        ' myDivisorが0の場合、このブロックのみが実行される
        result = "割れません"
    End If

    MsgBox "回避策(If...Then...Else): " & result, vbInformation
End Sub
    

コードの行数は増えますが、安全性が最優先されるべき場面では、If...Then...Elseを使用するのが鉄則です。

2. 条件式でエラーを事前に防ぐ(IIfをどうしても使いたい場合)

もし何らかの理由でIIf関数をどうしても使いたい場合は、条件式の中でエラー発生の可能性を完全に排除するロジックを組み込む必要があります。 ただし、これにより条件式が複雑になり、IIfを使うメリットである「簡潔さ」が薄れることがあります。


Sub Avoid_IIf_Error_By_StrictCondition()
    Dim myDivisor As Integer
    myDivisor = 0 ' 0に設定してもエラーは発生しません

    Dim result As Variant
    ' 条件式を「myDivisorが0ではない AND myDivisorが正の数である」とする
    ' これにより、myDivisorが0の場合、AND演算子のショートサーキット評価により
    ' 10 / myDivisor の評価前に条件がFalseと確定するため、エラーは発生しない
    ' ※VBAの論理演算子は、一部ショートサーキット評価をします(And, Or)
    result = IIf(myDivisor <> 0 And myDivisor > 0, 10 / myDivisor, "割れません")

    MsgBox "回避策(IIf条件強化): " & result, vbInformation
End Sub
    

上記の例では、And演算子のショートサーキット評価(左側の条件がFalseなら右側は評価されない)を利用してエラーを回避していますが、これはあくまで特定のケースに限定されます。 一般的に、エラー発生の可能性がある複雑な式をIIf関数で扱うのは避けるべきであり、素直にIf...Then...Elseを使用することを強くお勧めします。

まとめ:IIf関数を賢く使いこなすために

VBAのIIf関数は、簡単な条件分岐を1行で記述できるため、特に簡易ツールやアドホックなマクロ開発において、コードの可読性と記述速度を向上させる非常に強力な機能です。 VBAにおける「三項演算子」として、適切に利用すれば非常にスマートなコードが書けます。

しかし、その最大の注意点として、「真偽に関わらず両方の引数(真の場合の値・偽の場合の値)を評価する」という特性を常に意識しておく必要があります。 エラー発生の可能性がある式を扱う場合や、特定のプロシージャを呼び出すような副作用のある処理を伴う場合は、迷わず安全性の高いIf...Then...Elseステートメントを利用することが賢明です。

この特性を理解し、適切な場面でIIf関数を使い分けることで、あなたのVBAコードはより洗練され、開発効率も格段にアップするでしょう。 ぜひ今日からあなたのツール作成にIIf関数を賢く役立ててください!

VBAでの業務効率化、悩み解決します

「このマクロ、もっと速くならないかな?」「エラーが消えない…」
Access/VBA専門のwanna.jpにご相談ください。

無料相談はこちら