「売上一覧の中から、東京支店の売上だけを合計したい」といった、条件に一致するデータだけを合計する処理は、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プログラミングにおける非常に重要な考え方です。