目次
概要
オートフィルターで絞り込まれたレコード数を瞬時に取得したい場合、VBA から WorksheetFunction.Subtotal を呼び出す方法が最も手軽です。Subtotal 関数の集計コード 3(COUNTA) を利用すると、非表示行を自動的に除外した件数を取得できます。本記事では、実用的なサンプルコードとともにポイントを丁寧に解説いたします。
前提条件
項目 | 内容 |
---|---|
対応 Excel | Microsoft 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–8 | tgtCol にフィルター対象列(列 A)の全行を設定しています。必要に応じて列番号を変更してください。 |
11 | Subtotal(3, tgtCol) で可視セル(フィルター後に表示されている行)のみをカウントします。- 1 は見出し行を除外するためです。 |
13 | メッセージボックスで件数を通知しています。ユーザーへの確認用や後続処理の分岐にご活用ください。 |
応用ポイント
- 対象列を動的に指定
- 見出し名から列番号を検索し、
tgtCol = Cells(1, matchCol).EntireColumn
として設定すると汎用性が向上します。
- 見出し名から列番号を検索し、
- 行削除前の確認
- 削除処理を行う前に抽出件数を表示し、ユーザーに確認させることで誤操作を防げます。
- シート集計への転記
Range("F2").Value = recordCnt
のようにセルへ書き出すと、ダッシュボードで件数を可視化できます。
よくある質問
質問 | 回答 |
---|---|
Subtotal の集計コードにはどのような種類がありますか。 | 例として 1(AVERAGE)、2(COUNT)、3(COUNTA)、9(SUM)などがございます。詳細は Microsoft 公式リファレンスをご参照ください。 |
列に空白セルが含まれていても正確にカウントされますか。 | COUNTA は空白セルを除外してカウントします。空白セルを含む列で件数を取得したい場合は別列を対象にしてください。 |
まとめ
WorksheetFunction.Subtotal を利用すると、フィルター後の可視セルだけを簡単にカウントできます。まずはサンプルコードを実行し、期待どおりの件数が表示されることをご確認ください。対象列やメッセージ処理を調整すれば、多様なワークフローに応用可能です。