Excel VBAのIIf関数でIF文を置き換える方法|エラーになる原因と正しい書き方を解説

Visual Basic

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マクロを作成できます。

コメント

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