Excel VBAでWorksheetFunction.SumIfを使用すると、条件に一致しない場合でも「0」がセルに表示されることがあります。集計表では空白にしたいケースも多く、「なぜ0が出るのか」「空欄にできないのか」で悩む人は少なくありません。この記事では、SumIfで0が表示される理由と、VBAで空白表示に変更する方法を具体的なコード付きで解説します。
なぜ0が表示されるのか
今回のコードでは、以下の処理を行っています。
Worksheets("3").Cells(i, "J") = wf.SumIf(Bcol, .Cells(i, "I"), Ccol) + wf.SumIf(Bcol, .Cells(i, "I"), Ecol)
SumIfは、条件に一致するデータが存在しない場合でも、結果として「0」を返します。
つまりエラーではなく、正常動作です。
そのため、何も該当データが無い場合でもJ列に0が表示されます。
0ではなく空白にしたい場合
もっとも一般的な対処法は、一度変数へ結果を入れてから判定する方法です。
例えば以下のように変更します。
Sub f()
Dim wf As Object: Set wf = WorksheetFunction
Dim i As Long
Dim v As Double
Dim wS2 As Worksheet: Set wS2 = Worksheets("2")
Dim wS3 As Worksheet: Set wS3 = Worksheets("3")
Dim Bcol As Range: Set Bcol = wS2.Range("B3", wS2.Cells(Rows.Count, "B").End(xlUp))
Dim Ccol As Range: Set Ccol = wS2.Range("C3", wS2.Cells(Rows.Count, "C").End(xlUp))
Dim Ecol As Range: Set Ecol = wS2.Range("E3", wS2.Cells(Rows.Count, "E").End(xlUp))
With wS2
For i = 3 To .Cells(Rows.Count, 2).End(xlUp).Row
v = wf.SumIf(Bcol, .Cells(i, "I"), Ccol) + _
wf.SumIf(Bcol, .Cells(i, "I"), Ecol)
If v = 0 Then
wS3.Cells(i, "J") = ""
Else
wS3.Cells(i, "J") = v
End If
Next
End With
End Sub
この方法なら、合計結果が0のときだけ空白になります。
コード改善で重要なポイント
元コードでは、Range指定に少し気になる部分があります。
| 元コード | 改善後 |
|---|---|
| Cells(Rows.Count, “B”) | Cells(Rows.Count, “B”).End(xlUp) |
元の書き方だと、B列最終行まで全セルを対象にしてしまいます。
不要な空白セルまで集計対象になるため、処理速度低下の原因になります。
End(xlUp)を追加すると、実データ範囲だけを対象にできます。
WorksheetFunctionとApplicationの違い
VBAでは、SumIfを使う方法が2種類あります。
- WorksheetFunction.SumIf
- Application.SumIf
WorksheetFunctionはExcel関数とほぼ同じ動作ですが、エラー時に停止しやすい特徴があります。
一方、Application.SumIfは柔軟性が高く、実務VBAで使われるケースも多いです。
0表示を消す別の方法
VBAを変更せず、セルの表示形式で対応する方法もあります。
例えばJ列に以下の表示形式を設定します。
0;-0;;@
これにより、値が0のときだけ非表示になります。
ただし、実際の値は0のまま残っています。
実務でおすすめなのはどちらか
実務では、次のように使い分けることが多いです。
| 方法 | 特徴 |
|---|---|
| VBAで空白化 | 完全に空欄になる |
| 表示形式で非表示 | コード変更不要 |
後続処理で0判定を使う可能性がある場合は、表示形式だけ変更する方法も便利です。
処理速度を改善したい場合
データ件数が多い場合は、画面更新停止を追加すると高速化できます。
Application.ScreenUpdating = False
最後に戻します。
Application.ScreenUpdating = True
数千行以上になると、体感速度がかなり変わります。
まとめ
Excel VBAのSumIfで0が表示されるのは正常動作です。条件一致が無い場合でも、SumIfは0を返します。空白表示にしたい場合は、変数へ一旦代入してIf文で判定する方法がもっとも分かりやすく安全です。また、表示形式による非表示化という方法もあります。実務ではデータ量や後続処理を考慮しながら、用途に合った方法を選ぶのがおすすめです。


コメント