こんにちは!Excel VBA講師の「VBA道場」へようこそ。
前回は、IF関数の基本構造である「もし~ならば~、そうでなければ~」という単一条件の書き方を学びましたね。皆さんのコードを見ていると、少しずつVBAの構文に慣れてきている様子が伝わってきて、私も非常に嬉しく思っています。
さて、今回のテーマは「IF関数を使って判定の処理をしよう」の第2回目です。前回は「もし点数が80点以上なら合格」という単純な条件でしたが、実務の世界ではそんなに甘くありません。「80点以上かつ出席率が90%以上なら合格」といった「複数の条件」や、「90点以上ならS、80点以上ならA……」といった「段階的な判定」が必要になることがほとんどです。
今回は、そんな実務レベルの複雑な判定をスマートに実装するための「論理演算子」と「入れ子(ネスト)構造」について、徹底的に深掘りしていきます。
1. 複数の条件を同時に判定する「論理演算子」
実務でIF文を書いていると、「AかつB」や「AまたはB」といった条件を指定したくなる場面が多々あります。これを実現するのが「論理演算子」です。VBAで最もよく使うのは、以下の2つです。
・**And演算子**:すべての条件が真(True)である場合にのみ、処理が実行されます。
・**Or演算子**:いずれか一つの条件が真(True)であれば、処理が実行されます。
例えば、「売上が100万円以上」かつ「前年比110%以上」の営業マンをMVPと認定したい場合、以下のように記述します。
If Cells(i, 2).Value >= 1000000 And Cells(i, 3).Value >= 1.1 Then
Cells(i, 4).Value = “MVP”
End If
このようにAndでつなぐことで、条件が揃ったときだけ処理を走らせることができます。ここで初心者が陥りやすい罠が、「条件の書き方」です。
「Cells(i, 2).Value And Cells(i, 3).Value >= 1000000」のように書いてしまうと、VBAは正しく判定できません。必ず「条件式 And 条件式」という形で、左右に独立した比較式を書くように心がけてください。
2. 複雑な条件を整理する「入れ子(ネスト)構造」
次に、条件の中にさらに条件が含まれる「入れ子構造(ネスト)」について解説します。
例えば、「合格判定」の後に「さらに詳細な評価」を行う場合などです。
If Cells(i, 2).Value >= 80 Then
‘ 80点以上の処理
Cells(i, 3).Value = “合格”
‘ ここでさらに条件分岐(ネスト)
If Cells(i, 2).Value >= 95 Then
Cells(i, 4).Value = “特待生”
Else
Cells(i, 4).Value = “通常合格”
End If
Else
‘ 80点未満の処理
Cells(i, 3).Value = “不合格”
End If
このように、IF文の中にIF文を入れることで、複雑なロジックを段階的に記述できます。ただし、注意点が一つ。ネストを深くしすぎると、コードが「右へ右へと」伸びてしまい、非常に読みづらくなります。いわゆる「スパゲッティコード」の入り口です。
ネストは「最大でも3階層まで」を目安にしましょう。それ以上深くなる場合は、後述するSelect Case文への切り替えや、サブルーチンの分割を検討するタイミングです。
3. 読みやすいコードを書くための「インデント」の重要性
皆さんは、コードを書く際に「インデント(字下げ)」を意識していますか?
VBAのエディタでは、Tabキーを押すことでコードを右にずらすことができます。IF文の中身は必ずインデントを入れるのがプロの作法です。
‘ 悪い例:インデントがない
If x > 10 Then
x = x + 1
End If
‘ 良い例:インデントがある
If x > 10 Then
x = x + 1
End If
インデントを入れるだけで、どこからどこまでがIFの範囲なのかが一目でわかります。特にネストが深くなる場合、インデントがないと「どのEnd IfがどのIFに対応しているのか」を判断するだけで時間を浪費してしまいます。
VBAを美しく書くことは、デバッグの時間を減らすことと同義です。コードの見た目にもこだわりを持ちましょう。
4. 実務で役立つ「判定」のテクニック:空白チェック
最後に、実務で最も頻繁に発生する「データの有無」判定について触れておきましょう。
セルが空白かどうかを判定する際、皆さんはどう書いていますか?
If Cells(i, 1).Value = “” Then
‘ 空白の時の処理
End If
これでも動きますが、より厳密に「値が入っていないこと」を判定したい場合は、`vbNullString`定数を使うのがプロ流です。
If Cells(i, 1).Value = vbNullString Then
‘ 処理
End If
`vbNullString`はメモリ効率が良く、空の文字列を示す定数です。また、セルが「空っぽ」であることを判定する `IsEmpty関数` も非常に便利です。`If IsEmpty(Cells(i, 1)) Then …` と書くことで、コードの意図がより明確に伝わります。
まとめ:条件分岐を制する者はVBAを制する
今回の講義では、以下のポイントを学びました。
1. **論理演算子(And/Or)**を活用して、複数の条件を一つのIF文で処理する。
2. **入れ子(ネスト)構造**で、段階的な判定ロジックを構築する。
3. **インデント**を徹底し、可読性の高いコードを維持する。
4. **vbNullStringやIsEmpty**を活用し、プロらしい判定処理を実装する。
IF関数は、VBAの「頭脳」とも言える非常に重要な機能です。ここをマスターすれば、皆さんは単なる「作業の自動化」を超えて、「判断の自動化」ができるようになります。
Excelが人間の代わりに判断し、結果をセルに書き込んでくれる。これこそがVBAの醍醐味です。
次回(3/5)は、今回触れた「ネストが深くなりすぎる問題」を鮮やかに解決する「Select Case文」について解説します。「IF文を連打していたあの時間は何だったのか!」と驚くほどスッキリ書けるようになりますよ。
それでは、今回の課題です。
「A列に点数、B列に出席率が入っている表に対して、点数が60点以上かつ出席率が80%以上の場合はC列に『合格』、それ以外は『再試験』と表示するマクロ」を作成してみてください。
もしエラーが出たり、うまく動かない場合は、遠慮なくコメント欄で質問してくださいね。皆さんの挑戦をお待ちしています!
