VBAで条件によって値を切り替えたいとき、次のようなことはありませんか?
- 点数によって「合格」「不合格」を切り替えたい
- セルの値によって表示する文字を変えたい
- If~Then~Elseを書くほどでもない、簡単な条件分岐をしたい
このような場合は、IIf関数を使うことで解決できます。条件式の結果に応じて、2つの値のどちらかを1行で返すことができる便利な関数です。
この記事では、IIf関数の基本構文から、If~Then~Elseとの違い、実務でよく使うコードパターン、そして初心者がハマりやすい注意点までを分かりやすく解説します。
IIf関数とは
IIf関数は、指定した条件式の結果(True/False)に応じて、あらかじめ用意した2つの値のどちらかを返すVBAの組み込み関数です。
「IIf」は Immediate If(即時のIf)の略で、Excelのワークシート関数でいう IF関数 のVBA版のようなイメージで使えます。
基本構文
IIf(条件式, Trueの場合の値, Falseの場合の値)
- 条件式:True または False を返す式(比較式など)
- Trueの場合の値:条件式がTrueのときに返す値
- Falseの場合の値:条件式がFalseのときに返す値
基本的な使い方
まずはシンプルな例で動きを確認しましょう。
Sub IIfBasic()
Dim score As Long
score = 75
Dim result As String
result = IIf(score >= 60, "合格", "不合格")
MsgBox result ' → "合格"
End Sub
score が60以上ならTrueの値「合格」、そうでなければFalseの値「不合格」がresultに代入されます。If~Then~Elseで書くと4行かかる処理が、IIf関数なら1行で書けます。
If~Then~Elseとの比較
同じ処理をIf~Then~Elseで書くと、次のようになります。
Sub IfBasic()
Dim score As Long
score = 75
Dim result As String
If score >= 60 Then
result = "合格"
Else
result = "不合格"
End If
MsgBox result
End Sub
やっていることは同じですが、IIf関数を使うと1行にまとめられるため、簡単な条件分岐であればコードがすっきりします。
セルの値を条件にする例
実務では、セルの値を条件にして別のセルに結果を表示するケースがよくあります。
Sub IIfCellExample()
Dim i As Long
For i = 2 To 10
Cells(i, "B").Value = IIf(Cells(i, "A").Value >= 60, "合格", "不合格")
Next i
End Sub
A列の点数に応じて、B列に「合格」「不合格」を自動で入力できます。ワークシート関数のIF関数を使わずに、VBA側だけで判定処理を完結させたいときに便利です。
ネスト(入れ子)して3パターン以上に分岐させる
IIf関数はネストすることで、3つ以上の分岐にも対応できます。
Sub IIfNested()
Dim score As Long
score = 82
Dim rank As String
rank = IIf(score >= 90, "A", IIf(score >= 70, "B", IIf(score >= 50, "C", "D")))
MsgBox rank ' → "B"
End Sub
ただし、ネストが深くなるほど可読性が落ちるため、4段階を超えるような分岐は素直にSelect Caseを使う方が保守しやすくなります。
【重要】IIf関数を使うときの注意点
IIf関数は便利な反面、If~Then~Elseとは決定的に違う性質があります。初心者がよくハマるポイントなので、必ず押さえておきましょう。
1. TrueとFalse、両方の式が必ず評価される
If~Then~Elseでは、条件に一致しない側の処理は実行されません。しかしIIf関数は、条件の真偽にかかわらず、Trueの値とFalseの値の両方が必ず評価されます。
これが原因で、次のようなコードはエラーになります。
Sub IIfDivisionError()
Dim a As Long, b As Long
a = 10
b = 0
' bが0でもIIfの第3引数(a / b)が評価されるためエラーになる
Dim result As Variant
result = IIf(b = 0, "計算不可", a / b)
MsgBox result
End Sub
「bが0のときは計算しない」つもりで書いても、a / b の部分がVBA内部で計算されてしまい、実行時エラー「11(ゼロで除算しました)」が発生します。0除算やオブジェクトのNothing判定が絡む処理では、IIf関数ではなくIf~Then~Elseを使うようにしましょう。
2. 戻り値の型はVariant型になる
IIf関数の戻り値は常にVariant型です。数値や文字列など、TrueとFalseで異なる型の値を返すことも可能ですが、後続の処理で型を意識せずに使うと予期しない挙動につながることがあります。用途に応じて、必要であればCStrやCLngなどで明示的に型変換しておくと安全です。
3. セルがエラー値のときも要注意
条件式やTrue/False側の式にセル参照を使う場合、セルがエラー値(#N/Aなど)だと、IIf関数の評価自体でエラーになることがあります。エラーの可能性があるセルを扱う場合は、事前にIsError関数などでチェックしておくと安心です。
IIf関数が向いている場面・向いていない場面
| 向いている場面 | 向いていない場面 |
|---|---|
| 単純な二択の値の切り替え | 0除算やエラーが起きうる計算を含む分岐 |
| 1行で完結させたい代入処理 | 3段階以上の複雑な分岐(Select Caseが向く) |
| ループ内でセルに値をまとめて入力する処理 | 処理速度がシビアに求められる大量ループ(両辺評価のオーバーヘッドがある) |
まとめ
IIf関数を使いこなせるようになると、簡単な条件分岐を1行で書けるようになり、コードがすっきりします。ただし、TrueとFalseの両方が必ず評価されるという特性を理解しておかないと、0除算などで思わぬエラーにつながります。
「シンプルな値の切り替えはIIf関数」「エラーの可能性がある処理はIf~Then~Else」というように、場面に応じて使い分けることを意識してみてください。

コメント