目次
概要
オートフィルターで抽出された可視セルだけを集計したい場合には、WorksheetFunction.Subtotal が最適です。本記事では、抽出範囲の合計値とワークシート全体の合計値を同時に取得するサンプルコードを示し、Subtotal と Sum の違いを丁寧に解説いたします。
前提条件
| 項目 | 内容 |
|---|---|
| 対応 Excel | Microsoft 365 または 2016 以降 |
| データ列 | 列 E(売上金額など数値列を想定) |
| マクロ設置先 | 標準モジュール |
サンプルコード(VBA)
Sub CalculateFilteredTotals()
Dim visibleTotal As Double ' 抽出範囲の合計
Dim overallTotal As Double ' 全体範囲の合計
Dim tgtColumn As Range ' 対象列
' 列 E を対象列として設定
Set tgtColumn = ActiveSheet.Columns("E")
' 9 = SUM を意味する集計コード
visibleTotal = WorksheetFunction.Subtotal(9, tgtColumn)
' フィルター無視の合計
overallTotal = WorksheetFunction.Sum(tgtColumn)
MsgBox "抽出範囲の合計: " & visibleTotal & vbCrLf & _
"全体範囲の合計: " & overallTotal, _
vbInformation, "合計値の比較"
End Sub
コードのポイント
| 行 | 説明 |
|---|---|
| 9 | Subtotal(9, 対象範囲) でフィルター後に可視状態のセルのみ合計を取得しています。 |
| 12 | Sum 関数はフィルターの有無にかかわらず列全体を集計します。 |
| 14 | MsgBox で抽出範囲の合計と全体範囲の合計を並べて表示し、差異を一目で確認できます。 |
Subtotal と Sum の違い
| 項目 | Subtotal (9) | Sum |
|---|---|---|
| 非表示行(手動) | 無視 | 集計対象 |
| フィルターで非表示 | 無視 | 集計対象 |
| 数式サポート | あり | あり |
| 主な用途 | フィルター後の集計 | 全体集計 |
応用例
| 目的 | 実装のヒント |
|---|---|
| 行数を取得したい | 集計コード 3 (COUNTA) を使用します。 |
| 平均値を取得したい | 集計コード 1 (AVERAGE) を使用します。 |
| 結果をセルへ書き出す | Range("H2").Value = visibleTotal のようにセルへ直接転記します。 |
よくある質問
| 質問 | 回答 |
|---|---|
| 数値以外の列でも Subtotal は利用できますか。 | カウント系(COUNT、COUNTA など)の集計コードを指定すれば利用できます。 |
| テーブル(ListObject)でも同じコードを使えますか。 | ListObject.DataBodyRange.Columns("売上") のように対象範囲を指定すると同様に動作します。 |
まとめ
Subtotal はフィルターや手動の非表示行を自動で除外して集計できるため、抽出結果のみの合計値を取得する場面で非常に便利です。一方、Sum はシート全体を対象とします。両者を併用して差異を確認することで、レポートの精度向上に役立ててください。
技術書の購入コストを抑えてスキルアップするなら

ここまで読んでいただきありがとうございます。最後に宣伝をさせてください。
プログラミングの技術書や参考書は、1冊3,000円〜5,000円するものも多く、出費がかさみがちです。Kindle Unlimitedであれば、月額980円で500万冊以上の書籍が読み放題となります。
気になる言語の入門書から、アルゴリズム、基本設計の専門書まで、手元のスマホやPCですぐに参照可能です。現在は「30日間の無料体験」や、対象者限定の「3か月499円プラン」なども実施されています。まずはご自身のアカウントでどのようなオファーが表示されるか確認してみてください。
