VBAで自動化 VBA一覧 フィルター結果の取得・集計 抽出・検索処理

【VBA】フィルタ後の可視セル行数を取得する方法|抽出結果の件数を正確にカウントするテクニック

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

処理の流れ

  1. AutoFilter で条件(営業部)を設定
  2. 可視セル(A列のデータ範囲)を取得
  3. Rows.Count で行数をカウント
    参考:【VBA】行数を取得する方法:Rows.Countプロパティ
  4. 結果をメッセージで表示

出力例

営業部のデータ件数は 12 行です。

ポイント


✅ 実践②:ヘッダー行を除いた件数を取得する

上のコードでは、データ範囲を 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の引数解説

引数内容対応関数
101AVERAGE(平均)平均値
102COUNT件数
103COUNTA空白でない件数
104MAX最大値
109SUM合計値

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 件あります。

ポイント


✅ 実践⑤:件数を別シートやセルに自動出力

可視セル行数をメッセージで表示するだけでなく、
指定セルに書き出すことで「動的なレポート」として利用できます。


コード例

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作業の効率を大きく向上させるテクニックですので、ぜひ日々の業務に取り入れてみてください。

-VBAで自動化, VBA一覧, フィルター結果の取得・集計, 抽出・検索処理