Excelでオートフィルターを使ってデータを絞り込んだ後、
「条件に一致したデータが何件あるか(行数)」を知りたい、と思ったことはありませんか?
例えば次のようなケースです:
- 営業部の売上データが何件あるか確認したい
- 抽出した社員リストの件数を自動表示したい
- 条件に一致するデータが0件だった場合に処理を分岐させたい
VBAでは、フィルター後に表示されている行(可視セル)だけを数えることが可能です。
この記事では、フィルター結果の件数を正確に取得する方法を、エラー対策や応用例を交えて詳しく紹介します。
目次
✅ オートフィルタ後の可視セルとは?
Excelのオートフィルターを使うと、条件に一致しない行が「非表示」になります。
このとき、VBAで Range("A1:A100")
のように範囲を指定しても、
非表示行を含んでしまうため、正しい件数が取得できません。
そこで使うのが以下の構文です
可視セルを取得する構文
Range("範囲").SpecialCells(xlCellTypeVisible)
この SpecialCells(xlCellTypeVisible)
は、
非表示行を除外し、実際に表示されているセル(可視セル)だけを対象にします。
この仕組みを利用して、抽出結果の件数をカウントします。
参考:【VBA】条件に一致するセルを複数取得する方法|Find・For Each・SpecialCells
✅ 実践①:フィルター後の可視セル行数を取得する基本コード
まずは、最も基本的な方法から紹介します。
コード例
Sub CountVisibleRows()
Dim rng As Range
Dim cnt As Long
'--- フィルターを設定(B列:部署)---
Range("A1:C100").AutoFilter Field:=2, Criteria1:="営業部"
'--- フィルター後の可視セルを取得(A列)---
On Error Resume Next
Set rng = Range("A2:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
'--- 該当データがある場合 ---
If rng Is Nothing Then
MsgBox "営業部のデータは0件です。"
Else
cnt = rng.Areas(1).Rows.Count
MsgBox "営業部のデータ件数は " & cnt & " 行です。"
End If
'--- フィルター解除 ---
ActiveSheet.AutoFilterMode = False
End Sub
処理の流れ
AutoFilter
で条件(営業部)を設定- 可視セル(A列のデータ範囲)を取得
Rows.Count
で行数をカウント
参考:【VBA】行数を取得する方法:Rows.Countプロパティ- 結果をメッセージで表示
出力例
営業部のデータ件数は 12 行です。
ポイント
On Error Resume Next
を入れることで、0件のときにエラーで停止するのを防げます。
参考:【VBA】On Error Resume Nextでエラーを無視してエラーの制御- 可視セルが存在しない場合、
rng
はNothing
になります。
参考:【VBA】Findの戻り値を理解する方法|Nothing判定と実務での活用例を解説
✅ 実践②:ヘッダー行を除いた件数を取得する
上のコードでは、データ範囲を A2:A100
としているためヘッダーは含まれません。
もし A1:A100
のように指定してしまうと、1行多くカウントされてしまいます。
正確な件数を取得するには、データ行だけを範囲に指定するか、
カウント後に -1
する処理を入れるのが確実です。
コード例(ヘッダーを除外する方法)
Sub CountVisibleRows_ExcludeHeader()
Dim rng As Range
Dim cnt As Long
Range("A1:C100").AutoFilter Field:=3, Criteria1:=">=100"
On Error Resume Next
Set rng = Range("A1:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
MsgBox "該当データはありません。"
Else
cnt = rng.Rows.Count - 1 'ヘッダー分を除外
MsgBox "売上100以上のデータ件数は " & cnt & " 件です。"
End If
ActiveSheet.AutoFilterMode = False
End Sub
出力例
売上100以上のデータ件数は 8 件です。
このように、ヘッダー行を含んでいる場合は -1
することで正確な件数になります。
参考:【VBA】フィルター結果を取得する方法|抽出データを自在に活用する実践テクニック
✅ 実践③:SUBTOTAL関数で可視セル行数を求める
もうひとつの方法として、SUBTOTAL関数を利用する手もあります。
WorksheetFunction.Subtotal
を使うと、フィルター非表示行を自動的に除外して件数を計算できます。
コード例
Sub CountVisibleRows_WithSubtotal()
Dim cnt As Long
'--- フィルター設定(部署が「開発部」)---
Range("A1:C100").AutoFilter Field:=2, Criteria1:="開発部"
'--- SUBTOTALで可視セル行数をカウント ---
cnt = Application.WorksheetFunction.Subtotal(103, Range("A2:A100"))
MsgBox "開発部のデータ件数は " & cnt & " 行です。"
ActiveSheet.AutoFilterMode = False
End Sub
SUBTOTALの引数解説
引数 | 内容 | 対応関数 |
---|---|---|
101 | AVERAGE(平均) | 平均値 |
102 | COUNT | 件数 |
103 | COUNTA | 空白でない件数 |
104 | MAX | 最大値 |
109 | SUM | 合計値 |
→ 103
を指定すれば、フィルター後に表示されているセルの件数を自動で数えてくれます。
この方法のメリット
SpecialCells
よりもシンプルで高速- エラー処理が不要(0件でもエラーにならない)
- 数式での計算と同じ結果になる
✅ 実践④:複数条件で抽出した可視セル行数を求める
実務では「部署=営業部」「月=4月」など、複数条件でフィルターを設定することもよくあります。
もちろん、条件を増やしても行数カウントは同様に可能です。
コード例
Sub CountVisibleRows_MultiCondition()
Dim rng As Range
Dim cnt As Long
'--- フィルターを設定(B列:部署、C列:月)---
Range("A1:D100").AutoFilter Field:=2, Criteria1:="営業部"
Range("A1:D100").AutoFilter Field:=3, Criteria1:="4月"
'--- 可視セル取得 ---
On Error Resume Next
Set rng = Range("A2:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
MsgBox "営業部(4月)のデータは0件です。"
Else
cnt = rng.Rows.Count
MsgBox "営業部(4月)のデータは " & cnt & " 件あります。"
End If
ActiveSheet.AutoFilterMode = False
End Sub
出力例
営業部(4月)のデータは 5 件あります。
ポイント
- 複数条件を指定する場合は、
AutoFilter
を複数回呼び出せばOK
参考:【VBA】If文の複数条件をリストで判定する方法|効率的な条件分岐の書き方と応用 - 条件が多い場合はループで処理することも可能
✅ 実践⑤:件数を別シートやセルに自動出力
可視セル行数をメッセージで表示するだけでなく、
指定セルに書き出すことで「動的なレポート」として利用できます。
コード例
Sub OutputVisibleRowCount()
Dim rng As Range
Dim cnt As Long
Dim wsResult As Worksheet
Set wsResult = Sheets("集計")
Range("A1:C100").AutoFilter Field:=2, Criteria1:="総務部"
On Error Resume Next
Set rng = Range("A2:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
cnt = 0
Else
cnt = rng.Rows.Count
End If
wsResult.Range("B2").Value = cnt
wsResult.Range("A2").Value = "総務部の抽出件数"
MsgBox "件数を集計シートに出力しました。"
ActiveSheet.AutoFilterMode = False
End Sub
出力イメージ(集計シート)
部署 | 件数 |
---|---|
総務部の抽出件数 | 8 |
実務での応用例
- 各部署・支店ごとの抽出件数を自動集計
- 条件変更時にボタン一つで件数を更新
- 0件のときだけ赤字で警告表示する
✅ 実践⑥:フィルター後の行数をループで一括取得(部署別など)
全部署・全カテゴリごとの抽出件数を自動で取得して一覧化することも可能です。
以下のように Array
を使ってループ処理を組むと効率的です。
コード例
Sub CountByDepartment()
Dim deptList As Variant
Dim dept As Variant
Dim rng As Range
Dim cnt As Long
Dim wsResult As Worksheet
Dim i As Long
deptList = Array("営業部", "開発部", "総務部")
Set wsResult = Sheets("集計")
i = 2
For Each dept In deptList
Range("A1:C100").AutoFilter Field:=2, Criteria1:=dept
On Error Resume Next
Set rng = Range("A2:A100").SpecialCells(xlCellTypeVisible)
On Error GoTo 0
If rng Is Nothing Then
cnt = 0
Else
cnt = rng.Rows.Count
End If
wsResult.Range("A" & i).Value = dept
wsResult.Range("B" & i).Value = cnt
i = i + 1
Next dept
ActiveSheet.AutoFilterMode = False
MsgBox "部署別の件数を一覧化しました。"
End Sub
出力結果(集計シート)
部署 | 件数 |
---|---|
営業部 | 12 |
開発部 | 9 |
総務部 | 8 |
このように、部署ごとの抽出件数一覧を自動で生成できます。
毎月の業務報告書作成にも役立つ実務的な応用例です。
参考:【VBA】セルの値を変数配列に取得:ループ処理
✅ まとめ:フィルター後の可視セル行数を取得して自動集計を効率化
SpecialCells(xlCellTypeVisible)
で可視セルを取得Rows.Count
で行数(件数)をカウントNothing
判定で0件時のエラーを防ぐSubtotal(103, 範囲)
でも簡単に可視セル件数を取得可能- 結果をセルや別シートに出力すればレポート自動化に活用できる
VBAでフィルター後の行数を取得できるようになると、
単純な抽出作業だけでなく、動的な集計・条件別レポート・エラー通知処理などがすべて自動化できます。
Excel作業の効率を大きく向上させるテクニックですので、ぜひ日々の業務に取り入れてみてください。