【Excel VBA】SUMIF関数を使って条件に一致するデータを合計する方法

「売上一覧の中から、東京支店の売上だけを合計したい」といった、条件に一致するデータだけを合計する処理は、Excel業務の基本です。

VBAでこの処理を実現しようとすると、まずForループとIf文で1行ずつ条件をチェックし、足し上げていく方法が思い浮かびます。しかし、その方法ではデータ量が増えるにつれて、処理が非常に遅くなってしまいます。

もっとスマートで高速な解決策が、ワークシート関数のSUMIFをVBAから直接呼び出すことです。この記事では、2つの方法を比較し、WorksheetFunction.SumIfの圧倒的なメリットを解説します。


目次

方法1:ループ処理で1セルずつ判定する方法(非推奨)

まず、VBAの基本的な命令だけで条件付き合計を行うコードを見てみましょう。

Sub ConditionalSumWithLoop()
    Dim i As Long
    Dim totalSales As Double
    Dim targetSheet As Worksheet
    
    Set targetSheet = ThisWorkbook.Worksheets("SalesData")
    
    ' 10万行のデータを1行ずつチェック
    For i = 2 To 100001
        If targetSheet.Cells(i, "C").Value = "東京" Then
            totalSales = totalSales + targetSheet.Cells(i, "E").Value
        End If
    Next i
    
    ThisWorkbook.Worksheets("Summary").Range("B2").Value = totalSales
    MsgBox "ループ処理が完了しました。"
End Sub

このコードはロジックが分かりやすいですが、10万行のデータを1行ずつチェックするため、実行に数秒から数十秒かかってしまうこともあります。


方法2:WorksheetFunction.SumIf を使う方法(強く推奨)

次に、Excelの高速な計算エンジンを利用する、WorksheetFunction.SumIfを使った方法です。

コードと解説

Sub ConditionalSumWithSumIf()
    ' 変数を宣言します
    Dim criteriaRange As Range
    Dim sumRange As Range
    Dim condition As String
    Dim totalSales As Double
    
    '--- 設定 ---
    ' 条件を検索する列 (C列: 支店名)
    Set criteriaRange = ThisWorkbook.Worksheets("SalesData").Range("C:C")
    ' 合計したい数値が入力されている列 (E列: 売上金額)
    Set sumRange = ThisWorkbook.Worksheets("SalesData").Range("E:E")
    ' 合計する条件
    condition = "東京"
    '--- 設定ここまで ---
    
    ' WorksheetFunction.SumIf を使って条件に合う値を一括で合計
    totalSales = WorksheetFunction.SumIf(criteriaRange, condition, sumRange)
    
    ' 結果をセルに出力
    ThisWorkbook.Worksheets("Summary").Range("B2").Value = totalSales
    
    MsgBox "「" & condition & "」の合計売上は " & totalSales & " です。"
End Sub

このコードは、データが何十万行あっても一瞬で処理が完了します。

WorksheetFunction.SumIfは、セルで使うSUMIF関数とまったく同じ引数を取ります。 WorksheetFunction.SumIf(範囲, 検索条件, [合計範囲])

  • 第1引数 範囲: 検索条件をチェックするセル範囲(例: 支店名の列)
  • 第2引数 検索条件: 合計するデータの条件(例: “東京”)
  • 第3引数 [合計範囲]: 実際に合計したい数値が入っているセル範囲(例: 売上金額の列)

まとめ

条件に一致するデータを合計する場合、2つの方法には以下のような明確な違いがあります。

方法長所短所
ループ処理処理の流れが初学者にも分かりやすい。データ量に比例して極端に遅くなる
ワークシート関数圧倒的に高速。コードが簡潔で読みやすい。特になし。

Google スプレッドシートにエクスポート

結論として、条件付きの合計や集計を行う場合は、迷わずWorksheetFunctionオブジェクト(SumIf, CountIf, SumIfsなど)を使いましょう。

複雑なループ処理を自前で書くよりも、Excelに組み込まれた最適化済みの関数を利用するほうが、はるかに高速で、コードもシンプルになり、バグも少なくなります。これは、効率的なVBAプログラミングにおける非常に重要な考え方です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次