【VBAリファレンス】第8回 IF関数を使って判定の処理をしよう 4/5 複雑な条件を網羅するネスト(入れ子)構造と論理演算子の極意

スポンサーリンク

概要

Excel VBAにおける条件分岐の要であるIF関数(If…Then…Elseステートメント)。本連載の第8回となる今回は、単なる二者択一の判定を超え、実務現場で頻出する「複雑な条件判定」を完璧にマスターするためのステップとして、If文のネスト(入れ子)構造と、And/Or演算子を用いた高度な条件指定について解説します。業務効率化を目指すVBAエンジニアにとって、条件分岐の精度と可読性は、メンテナンス性を左右する極めて重要なスキルです。本稿では、コードの迷路に陥らないための論理的な組み立て方を徹底的に深掘りします。

詳細解説:If文のネストと論理演算子の使い分け

VBAで複雑な条件を扱う際、主に二つのアプローチがあります。一つは「If文の中にさらにIf文を記述する」ネスト構造、もう一つは「AndやOrを用いて一つのIf文の中に複数の条件を詰め込む」方法です。

まず、ネスト構造についてです。これは「大分類を判定した後に、その中で小分類を判定する」という、階層的なロジックを組む際に有効です。例えば、「売上が目標を達成しているか」を判定し、達成していれば「前年比で伸びているか」を判定する、といったケースです。しかし、ネストが深くなりすぎると「スパゲッティコード」と呼ばれる、誰にも読めないコードになってしまいます。原則としてネストは3階層以内、可能であれば2階層までに抑えるのがプロの流儀です。

次に、論理演算子であるAndとOrの活用です。
And演算子は「全ての条件を満たす場合のみTrue」となります。例えば、「A列が100以上」かつ「B列が50以上」という二つの条件を同時に満たす場合を指します。
Or演算子は「いずれか一つの条件でも満たせばTrue」となります。これは「A列が100以上」または「B列が50以上」という、どちらか一方でも基準に達していれば良い場合に有効です。

これらを組み合わせることで、複雑な判定ロジックを極めて簡潔に記述することが可能になります。特に、条件判定の順序(評価の優先順位)を理解することは、バグのないプログラムを書くための必須条件です。

サンプルコード:実務で使える多段階評価ロジック

以下のサンプルコードは、売上データに基づき、営業成績を「S・A・B・C」の4段階で評価するマクロです。ネスト構造と条件判定を組み合わせることで、どのようなロジックが組めるかを確認してください。


Sub EvaluateSalesPerformance()
    Dim sales As Long
    Dim satisfaction As Integer
    Dim grade As String
    
    ' セルからのデータ取得を想定(例:A1セルに売上、B1セルに顧客満足度)
    sales = Range("A1").Value
    satisfaction = Range("B1").Value
    
    ' 複雑な判定ロジック
    ' 売上1000以上かつ満足度80以上ならS
    If sales >= 1000 And satisfaction >= 80 Then
        grade = "S"
    ElseIf sales >= 1000 Or satisfaction >= 80 Then
        ' どちらかが満たされていればA
        grade = "A"
    ElseIf sales >= 500 Then
        ' 売上が500以上ならB
        grade = "B"
    Else
        ' それ以外はC
        grade = "C"
    End If
    
    ' 結果をセルに出力
    Range("C1").Value = grade
    MsgBox "評価判定が完了しました。評価: " & grade
End Sub

このコードでは、If…ElseIf…Else構造を活用しています。ElseIfを用いることで、ネストを深くすることなく、並列的な条件分岐をスマートに整理しています。

実務アドバイス:メンテナンス性を高める記述術

実務における条件分岐で最も恐ろしいのは、「後から仕様変更が入った際に、どの条件がどこまで影響しているか分からなくなること」です。これを防ぐための技術的アドバイスを3点提示します。

1. インデントを徹底する
If文の階層ごとに必ずTabキーでインデント(字下げ)を行ってください。インデントが崩れているコードは、それだけで信頼性が低いとみなされます。

2. 定数や変数に条件を切り出す
複雑な条件式(例:If sales * 1.08 > target * 0.95 Then…)をそのままIf文に書かないでください。一度変数に計算結果を代入し、その結果を判定の材料にすることで、コードの可読性が飛躍的に向上します。

3. 「正常系」を先に書く
エラー処理や例外的な条件を先に記述(ガード句)することで、メインの処理をネストさせずに記述できます。If…ElseIfの連続で複雑さを管理しましょう。

まとめ

第8回となる今回は、IF関数による複雑な判定処理について、ネストと論理演算子という二つの観点から解説しました。VBAの条件分岐は単なる「もし~ならば」の判断ではなく、ビジネスロジックをExcelに実装する際の「設計図」そのものです。

・ネストは深くしすぎない。
・And/Or演算子で条件をスマートに統合する。
・ElseIfを使いこなして並列的な判定を行う。

これらを意識するだけで、あなたの書くVBAコードの品質は劇的に向上します。次回は、より高度な条件分岐であるSelect Caseステートメントについて解説します。今回学んだIf文との使い分けを理解することで、さらに洗練されたVBAエンジニアへとステップアップしましょう。継続は力なり。日々の業務で、今回学んだコードをぜひ実際に打ち込んでみてください。

タイトルとURLをコピーしました