はじめに
VBAで条件によって処理を分岐させる場面は多くあります。
その書き方には複数の選択肢がありますが、どの方法を選ぶかでコードの安全性や可読性が大きく変わります。
本記事では以下の3つの方法を比較しながら、おすすめの使い方と注意点を整理します。
- If…Then…Elseブロック
- Select Case
- IIf関数(※非推奨)
Ifブロック ― 最も安全で基本的な条件分岐
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub If_Sample() Dim score As Integer Dim result As String score = 100 '// 60点以上の場合 If score >= 60 Then result = "合格" '// その他(60点未満の場合) Else result = "不合格" End If Debug.Print result '// → "合格"と出力 End Sub |
特徴とメリット
- VBAで最も一般的かつ基本的な条件分岐
- 複数の処理をブロック内に記述可能
- If文でエラーを回避することができる。例えば以下のように変数に0が入っている可能性がある場合に、If文で変数値を確認してゼロ除算を回避するなどです。(※ここ重要)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Sub If_Sample2() Dim x As Integer Dim result As Double x = 0 '// xが0ではない場合 If x <> 0 Then result = 100 / x '// その他(xが0の場合) Else result = 0 End If Debug.Print result '// → "0"と出力 End Sub |
デメリット
- 短い条件でも数行必要になる。簡潔さには劣る。
Select Case ― 複数の値を整理して分岐したいときに便利
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Sub SelectCase_Sample() Dim score As Integer Dim result As String score = 90 '// 点数で分岐 Select Case score '// 80点以上の場合 Case Is >= 80 result = "優" '// 60点以上の場合 Case Is >= 60 result = "良" '// その他 Case Else result = "不可" End Select Debug.Print result '// 優と出力 End Sub |
特徴とメリット
- 同じ変数に対する条件分岐を読みやすく整理できる
- 条件が増えても横並びで管理できる
- Ifと同様、条件を満たしたブロックのみが実行されるため、If文を理解していれば使い方は迷いにくい。
デメリット
- 複雑な条件では不向き。比較式の柔軟さはIfブロックに劣る。
IIf関数 ― 簡潔だが非推奨。その理由とは?
IIf関数の第一引数の条件に一致していれば、第二引数が採用され、条件に一致していなければ第三引数が採用されます。
1 2 |
'// 60点以上は合格、それ以外は不合格 result = IIf(score >= 60, "合格", "不合格") |
一見便利だが…
- 三項演算子風の書き方で短く書ける。他言語での三項演算子と見た目が似ているので多言語習得者は違和感があまりなく使える。
- ExcelのIF関数と似ているため、親しみやすい(、と感じる人もいるかもしれない。)
しかし、致命的な欠点がある
- すべての引数が常に評価される(=遅延評価ができない)
以下の例では、x = 0の場合、100 / x が実行されてしまい、**エラー(ゼロ除算)**になります。
1 2 3 4 5 6 7 |
Sub IIf_NG_Sample() Dim x As Integer Dim result As Double x = 0 result = IIf(x <> 0, 100 / x, 0) '// → エラーになる End Sub |
IIf関数の第1引数「x <> 0」と第2引数「100 / x」の両方が実行されるため「100 / x」でxが0での0割りの場合にエラーになります。そのため、IIf関数は基本的に使わないことを推奨します。
IIf関数の詳細は以下をご参照ください。
VBAの三項演算子(IIf関数)
まとめ ― 安全で読みやすい条件分岐の選び方
方法 | 向いている場面 | 主なメリット | 主なデメリット |
---|---|---|---|
Ifブロック | 一般的な条件分岐、柔軟な条件 | 安全・柔軟・読みやすい | 簡潔さにはやや欠ける |
Select Case | 値のパターン分岐が多い時 | 条件が多くても見やすい | 複雑な条件式は不得意 |
IIf関数 | 表示用途など極めて単純な条件 | 一行で書けて見た目が簡潔 | エラー評価が強制・安全でない |
プログラミングは「短く書ける」ことよりも「安全で読みやすいコード」が大切です。
IIf関数は簡潔に書ける魅力がある一方で、評価順序の問題により思わぬ不具合を生みやすいため、通常の開発では IfブロックやSelect Caseの使用を強くおすすめします。