なぜ「Subtotal」が必要なのか?
「あぁ、また合計がズレてる……。フィルターで絞り込んだのに、非表示の行まで計算されちゃってるよ……」
こんな経験はありませんか?
実は私も以前、VBAで単純なSUM関数を使って集計ツールを作成した際、フィルター適用後の数値が意図しない結果になってしまったことがあります。
Excelの合計といえばSUM関数が有名ですが、実務(特にフィルターを使う場面)では「SUBTOTAL関数」こそが真の主役になります。今回は、1クリックで完璧な集計表を作成できるVBAコードをご紹介します。
通常のSUM関数は、非表示になっている行の数値もすべて足し合わせてしまいます。
一方、SUBTOTAL関数は「今画面に見えているデータだけ」を正確に計算してくれます。
実務で役立つ!SUBTOTAL関数を組み込んだVBAコード
以下のコードは、A列からC列にあるデータの「C列(金額)」を、フィルター後の状態に合わせて集計するものです。
Sub AutoSubtotal()
' --- 変数の宣言 ---
Dim ws As Worksheet
Dim lastRow As Long
Dim totalValue As Double
Set ws = ThisWorkbook.Sheets("売上データ")
' 1. データの最終行を取得(これでお尻の行を自動判別!)
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
' 2. WorksheetFunctionを使ってSubtotalを実行
' 第1引数の「9」はSUM(合計)を意味します
' フィルターで隠れた行を除外して計算してくれます
On Error Resume Next ' データがない場合のエラー回避
totalValue = Application.WorksheetFunction.Subtotal(9, ws.Range("C2:C" & lastRow))
On Error GoTo 0
' 3. 結果を表示(セルのE1に出力)
ws.Range("E1").Value = "表示行の合計:" & Format(totalValue, "#,##0")
MsgBox "集計が完了しました!今回の合計は " & Format(totalValue, "#,##0") & " 円です。"
End Sub
VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。
リンク
リンク

コメント