Excel VBAでは、条件によって処理を分けたい場合にIf文がよく使われますが、短い条件分岐であればIIf関数を利用して1行で記述することもできます。ただし、IIf関数はIf文とは動作が異なるため、計算式やセル参照を含む処理では思わぬエラーが発生することがあります。この記事では、VBAのIIf関数で条件分岐を書く方法と、割り算などでエラーを防ぐための正しい使い方について解説します。
VBAのIIf関数とは?If文との違いを理解する
IIf関数は、条件式の結果によって2つの値のどちらかを返すための関数です。基本的な構文は以下のようになります。
IIf(条件式, 条件がTrueの場合の値, 条件がFalseの場合の値)
例えば、A1セルの値が10以上なら「合格」、それ以外なら「不合格」と表示する場合は、以下のように書けます。
Range("B1").Value = IIf(Range("A1").Value >= 10, "合格", "不合格")
ただし、VBAのIIf関数には重要な注意点があります。それは、True側とFalse側の両方の式を評価するという点です。
通常のIf文では条件を満たした側だけが実行されますが、IIfでは使われない側の計算も内部的には行われます。この違いが、今回のような割り算処理でエラーになる原因になります。
IIfで割り算をするとエラーになる理由
例えば、次のようなコードを考えます。
r.Offset(, 3) = IIf(r.Offset(, 1) > 0, r.Offset(, 2) / r.Offset(, 1), 0)
一見すると「右隣のセルが0より大きい場合だけ割り算する」ように見えます。しかし、IIfは両方の結果を評価するため、r.Offset(, 1)が0の場合でも、裏側では以下の計算が実行されます。
r.Offset(, 2) / r.Offset(, 1)
その結果、0で割り算をすることになり、「0で除算しました」というエラーが発生します。
このような計算処理を含む場合、単純にIf文をIIfへ変更するだけでは正常に動作しないケースがあります。
安全にIIfを使う場合の正しい書き方
計算式でエラーを防ぐには、割り算する値自体を調整する方法があります。例えば、分母が0の場合を別の値に置き換えます。
r.Offset(, 3).Value = IIf(r.Offset(, 1).Value > 0, r.Offset(, 2).Value / IIf(r.Offset(, 1).Value = 0, 1, r.Offset(, 1).Value), 0)
ただし、このような書き方は複雑になりやすいため、業務で使用するマクロでは可読性を考えてIf文を使うほうが安全な場合も多くあります。
IIfは表示用の文字変更や単純な値の切り替えなど、計算処理を伴わない場面で利用すると便利です。
今回の処理をIIf形式で記述する場合
元のIf文では、条件を満たした場合だけ割り算を行い、それ以外では0を入力しています。この処理をIIfに近い形で書く場合は、エラー対策を入れる必要があります。
For Each r In Range("J4", Cells(Rows.Count, "J").End(xlUp))
r.Offset(, 3).Value = IIf(r.Offset(, 1).Value > 0, r.Offset(, 2).Value / r.Offset(, 1).Value, 0)
Next
しかし、このコードは分母が0の場合にエラーになる可能性があります。そのため、実際のデータに空白や0が含まれる可能性がある場合は注意が必要です。
安全性を優先するなら、元のIf文のまま記述する方法がおすすめです。
実務ではIf文とIIfを使い分けることが重要
IIfはコードを短くできる便利な関数ですが、すべてのIf文を置き換えられるわけではありません。
例えば、以下のような処理ならIIfが向いています。
- 条件によって文字を変更する
- 条件によって単純な数値を入れる
- セル表示用の値を切り替える
一方で、以下のような処理ではIf文のほうが適しています。
- 割り算や計算処理を含む
- エラーになる可能性がある処理
- 複数の処理を条件によって分ける
短いコードを書くことよりも、エラーが発生せず後から修正しやすいコードを書くことがVBAでは重要です。
まとめ|VBAのIIfは便利だが計算処理では注意が必要
VBAのIIf関数は、条件によって値を切り替える場合に便利な機能です。しかし、If文とは違ってTrue側とFalse側の両方が評価されるため、割り算などを含む処理ではエラーの原因になります。
今回のように「条件を満たした場合だけ計算したい」という処理では、無理にIIfへ変更せずIf文を使うほうが安全です。
IIfは単純な値の切り替えに利用し、計算や複雑な処理ではIf文を使うというように、目的に合わせて使い分けることで、安定したVBAマクロを作成できます。


コメント