【VBAリファレンス|実務向け】[VBAで「IFの入れ子」を卒業!複雑な条件分岐をスマートに書くテクニック]

スポンサーリンク

1. 導入:なぜ「IFの入れ子」を避けるべきなのか

実務でExcel VBAを書いていると、条件が重なり「IFの中にさらにIFを入れる」という入れ子構造(ネスト)を多用しがちです。しかし、条件が増えるほどコードの可読性は下がり、修正時のバグ発生率も跳ね上がります。本稿では、複雑な条件分岐を簡潔に、かつ論理的に記述するための「算術演算子を活用した条件判定」について解説します。

2. 基礎知識:AND条件とOR条件の論理計算

Excelの関数やVBAにおいて、論理値は「True」が-1(または1)、「False」が0として扱われます。この性質を利用すると、条件式を数学的に表現できます。

AND条件(AかつB):
条件A(True/False) × 条件B(True/False)
両方がTrue(1)の時だけ結果が1(True)になります。

OR条件(AまたはB):
条件A(True/False) + 条件B(True/False)
どちらか一方がTrue(1以上)であれば結果が1以上(True)になります。

この考え方をVBAのコードに組み込むことで、複雑なIF文をスッキリとまとめることができます。

3. 実装/解決策:論理判定のスマートな活用

例えば、「会員(B列が○)かつ注文金額(D列)が20,000円以上」という条件をVBAで書く場合、以下のように記述できます。

IF (Range(“B6”).Value = “○”) (Range(“D6”).Value >= 20000) Then …

このように、条件式同士を掛け算することで、AND条件を一行で表現できます。複数のIFを連ねるよりも、条件の全体像が一目で把握できるのが大きなメリットです。

4. サンプルプログラム

以下は、参考事例の「割引計算」をVBAで実装した例です。入れ子を最小限にし、条件を明確に定義しています。

Sub CalculateDiscount()
Dim ws As Worksheet
Dim lastRow As Long, i As Long
Dim isMember As Boolean, amount As Double, age As Long

Set ws = ActiveSheet
lastRow = ws.Cells(Rows.Count, “B”).End(xlUp).Row

For i = 6 To lastRow
isMember = (ws.Cells(i, 2).Value = “○”)
amount = ws.Cells(i, 4).Value
age = ws.Cells(i, 3).Value

‘ 1. 会員かつ2万円以上(3割引)
If isMember (amount >= 20000) Then
ws.Cells(i, 5).Value = amount 0.7

‘ 2. 会員かつ2万円未満(2割引)
ElseIf isMember Then
ws.Cells(i, 5).Value = amount 0.8

‘ 3. 非会員かつ20歳未満(1割引)
ElseIf (Not isMember) (age < 20) Then ws.Cells(i, 5).Value = amount 0.9 ' 4. それ以外(割引なし) Else ws.Cells(i, 5).Value = amount End If Next i End Sub

5. 応用・注意点

この手法を用いる際の注意点は以下の2点です。

・括弧を忘れないこと:
VBAは優先順位があるため、条件式には必ず括弧を付けてください。「IF A = 1 B = 2 Then」と書くと、演算順序が狂い予期せぬ結果になります。必ず「IF (A = 1) (B = 2) Then」と記述しましょう。

・可読性のバランス:
この手法は便利ですが、条件が複雑になりすぎると、逆に計算式が読みにくくなる場合があります。条件が4つ以上のAND/ORで構成される場合は、無理に1行にまとめず、Select Case文を使ったり、一度Boolean型の変数に結果を代入してから判定したりする方が、後々のメンテナンスが楽になります。

実務では「動くコード」を作るだけでなく、「次に読む人が理解しやすいコード」を目指しましょう。ぜひ明日からの開発に取り入れてみてください。

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