Excel VBA でフィルター抽出件数を取得する方法【Subtotal 関数を活用】

目次

概要

オートフィルターで絞り込まれたレコード数を瞬時に取得したい場合、VBA から WorksheetFunction.Subtotal を呼び出す方法が最も手軽です。Subtotal 関数の集計コード 3(COUNTA) を利用すると、非表示行を自動的に除外した件数を取得できます。本記事では、実用的なサンプルコードとともにポイントを丁寧に解説いたします。


前提条件

項目内容
対応 ExcelMicrosoft 365 または 2016 以降
事前設定シートにオートフィルターが適用されていること
マクロ配置先標準モジュール

サンプルコード(VBA)

Sub GetFilteredRecordCount()

    Dim recordCnt As Long          ' 抽出件数を格納
    Dim tgtCol    As Range         ' 件数取得対象列
    
    ' 件数を数える列(例:列 A)を設定
    Set tgtCol = ActiveSheet.Columns(1)
    
    ' COUNTA を示す集計コード 3 を指定
    recordCnt = WorksheetFunction.Subtotal(3, tgtCol) - 1   ' 見出し行を除外
    
    MsgBox "現在抽出されている件数は " & recordCnt & " 件です。", vbInformation

End Sub

コード解説

説明
7–8tgtCol にフィルター対象列(列 A)の全行を設定しています。必要に応じて列番号を変更してください。
11Subtotal(3, tgtCol) で可視セル(フィルター後に表示されている行)のみをカウントします。- 1 は見出し行を除外するためです。
13メッセージボックスで件数を通知しています。ユーザーへの確認用や後続処理の分岐にご活用ください。

応用ポイント

  1. 対象列を動的に指定
    • 見出し名から列番号を検索し、tgtCol = Cells(1, matchCol).EntireColumn として設定すると汎用性が向上します。
  2. 行削除前の確認
    • 削除処理を行う前に抽出件数を表示し、ユーザーに確認させることで誤操作を防げます。
  3. シート集計への転記
    • Range("F2").Value = recordCnt のようにセルへ書き出すと、ダッシュボードで件数を可視化できます。

よくある質問

質問回答
Subtotal の集計コードにはどのような種類がありますか。例として 1(AVERAGE)、2(COUNT)、3(COUNTA)、9(SUM)などがございます。詳細は Microsoft 公式リファレンスをご参照ください。
列に空白セルが含まれていても正確にカウントされますか。COUNTA は空白セルを除外してカウントします。空白セルを含む列で件数を取得したい場合は別列を対象にしてください。

まとめ

WorksheetFunction.Subtotal を利用すると、フィルター後の可視セルだけを簡単にカウントできます。まずはサンプルコードを実行し、期待どおりの件数が表示されることをご確認ください。対象列やメッセージ処理を調整すれば、多様なワークフローに応用可能です。

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

この記事を書いた人

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

目次