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型の変数に結果を代入してから判定したりする方が、後々のメンテナンスが楽になります。
実務では「動くコード」を作るだけでなく、「次に読む人が理解しやすいコード」を目指しましょう。ぜひ明日からの開発に取り入れてみてください。
