VBAで「SUBTOTAL(小計)」を自動化!フィルター後も計算ミスを防ぐコードを解説

【業務効率化】VBA
スポンサーリンク

なぜ「Subtotal」が必要なのか?

「あぁ、また合計がズレてる……。フィルターで絞り込んだのに、非表示の行まで計算されちゃってるよ……」

こんな経験はありませんか?

実は私も以前、VBAで単純なSUM関数を使って集計ツールを作成した際、フィルター適用後の数値が意図しない結果になってしまったことがあります。

Excelの合計といえばSUM関数が有名ですが、実務(特にフィルターを使う場面)では「SUBTOTAL関数」こそが真の主役になります。今回は、1クリックで完璧な集計表を作成できるVBAコードをご紹介します。

通常のSUM関数は、非表示になっている行の数値もすべて足し合わせてしまいます

一方、SUBTOTAL関数は「今画面に見えているデータだけ」を正確に計算してくれます

【業務効率化】VBAの記事を見る 

実務で役立つ!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の記事を見る 


VBAを独学で学び、業務自動化に5年以上携わってきた私が、「本当に実務で役立った!」と感じた2冊を紹介します。 もう本選びで失敗したくない方は、よければ参考にしてみてください。

この記事を書いた人
ぐー

手取り15万円の会社員でしたが、年間100万円以上節約していました。
株式投資で年間360万円以上投資し、iDeCoも併用しています。
総資産はアッパーマス層に到達しました。
資格は日商簿記3級を持っています。

このブログでは、私が実践してきた節約術やリアルな資産運用、生産性を高めるITスキルについて発信しています。

生活を豊かにするため、高配当株投資で年間配当金60万円をめざしています。
現在の年間配当金は30万円ほどです。

ゲーム・漫画・アニメなどが好きです。
一緒に資産形成をがんばりましょう!
よろしくお願いします!

ぐーをフォローする
【業務効率化】VBAITスキル
スポンサーリンク
ぐーをフォローする

コメント

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