Excel VBAのSumIfで0が表示される原因と対処法|空白にしたい場合の書き方を解説

Visual Basic

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文で判定する方法がもっとも分かりやすく安全です。また、表示形式による非表示化という方法もあります。実務ではデータ量や後続処理を考慮しながら、用途に合った方法を選ぶのがおすすめです。

コメント

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