Excel VBAのIIf関数で複数条件を判定する方法|文字条件・日付比較・除外条件を組み合わせる書き方

Visual Basic

Excel VBAで集計処理を作成していると、特定の文字が含まれる場合や日付の条件によってカウント対象から除外したいケースがあります。特にIIf関数を使って複数条件を組み合わせる場合、文字列判定や日付判定の書き方でつまずきやすいポイントがあります。この記事では、VBAのIIf関数で複数の条件を設定し、条件に一致したデータだけをカウントする方法について解説します。

VBAのIIf関数で複数条件を設定するときの基本

IIf関数は、条件によって返す値を切り替えることができる便利な関数です。基本構文は以下のようになります。

IIf(条件式, 条件がTrueの場合の値, 条件がFalseの場合の値)

例えば、セルA1が空白なら0、値が入っていれば1を返す場合は、以下のように記述できます。

IIf(Range("A1").Value="",0,1)

ただし、条件が3つ以上になる場合はIIfを入れ子にして書く必要があります。文字条件、日付条件、比較条件などを順番に判定すると読みやすいコードになります。

文字列が特定の値の場合にカウントしない条件の書き方

例えばF列に「N」または「未契約」という文字が入っている場合、カウントしない処理を作る場合はOr条件を利用します。

具体的には以下のように記述できます。

IIf(r.Offset(,1).Value="N" Or r.Offset(,1).Value="未契約",0,1)

この条件では、対象セルがNまたは未契約の場合は0を返し、それ以外の場合は1を返します。

文字列条件を追加するときは、IIfの中にさらにIIfを重ねる方法もありますが、条件が増える場合はIf文を利用したほうが管理しやすくなります。

日付データかどうかを判定する方法

Excelでは見た目が日付でも、実際には文字列として保存されている場合があります。そのため、日付比較を行う前にIsDate関数で確認することが重要です。

例えばF列が日付ではない場合に除外するなら、以下のような条件になります。

IIf(IsDate(r.Offset(,1).Value)=False,0,1)

IsDate関数は、対象データがExcelで日付として認識できる場合にTrueを返します。日付以外の文字や空白データを含む可能性がある場合は、先に判定しておくことでエラーを防げます。

F列とG列の日付を比較して条件判定する方法

F列の日付がG列より後の場合にカウントしない場合は、単純な日付比較で判定できます。

例えばF列が6月18日、G列が6月17日の場合、F列のほうが未来の日付になるため除外します。

VBAでは以下のように記述できます。

IIf(r.Offset(,1).Value>r.Offset(,2).Value,0,1)

Excelの日付は内部的にはシリアル値として管理されているため、文字列に変換せず、そのまま比較するほうが安全です。Format関数で文字列化して比較すると、日付形式によって意図しない結果になる場合があります。

複数条件を組み合わせたIIfの実例

今回のように「Aを含む場合は除外」「日付でない場合は除外」「F列がNまたは未契約なら除外」「F列がG列より後なら除外」という条件の場合、以下のような考え方で組み立てます。

IIf(InStr(r.Offset(,0).Value,"A")>0,0,IIf(IsDate(r.Offset(,1).Value)=False,0,IIf(r.Offset(,1).Value="N" Or r.Offset(,1).Value="未契約",0,IIf(r.Offset(,1).Value>r.Offset(,2).Value,0,1))))

この処理では、最初に除外条件を順番に確認し、どれか1つでも条件に該当した場合は0を返します。すべての条件を通過した場合だけ1としてカウントできます。

ただし、条件が増えるほどIIfの入れ子は複雑になり、後から修正しづらくなります。その場合はIf文で処理を分ける方法がおすすめです。

IIfよりIf文を使ったほうが良いケース

IIfは短い条件判定には便利ですが、複数条件やエラー回避が必要な処理ではIf文のほうが安全です。

例えば以下のように書くと、処理内容が明確になります。

If InStr(r.Value,"A")>0 Then
 result=0
ElseIf Not IsDate(r.Offset(,1).Value) Then
 result=0
ElseIf r.Offset(,1).Value="N" Or r.Offset(,1).Value="未契約" Then
 result=0
ElseIf r.Offset(,1).Value>r.Offset(,2).Value Then
 result=0
Else
 result=1
End If

このように書くと、どの条件で除外されているか確認しやすく、後から条件を追加する場合も修正が簡単になります。

まとめ|VBAのIIfで条件判定するときは順番と型に注意する

Excel VBAのIIf関数で複数条件を扱う場合は、文字判定、日付判定、日付比較などを順番に整理して記述することが重要です。

特に「N」「未契約」のような文字条件はOrを使って判定し、日付比較ではFormatで文字列化せず、日付データのまま比較すると安定した処理になります。

条件が多くなる場合はIIfを無理に入れ子にするより、If文へ変更したほうがメンテナンス性が高く、後から修正しやすいVBAコードになります。

コメント

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