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

【VBA】オートフィルタの先頭行を取得する方法|抽出結果の一番上のデータを正確に扱うテクニック

Excelのオートフィルターでデータを絞り込んだあと、
「抽出結果の先頭行(最初に表示されているデータ)」だけを取得したい場面は少なくありません。

例えば、

  • 条件に一致した最初のレコードを別シートへ転記したい
  • 抽出結果の先頭セルを基準に処理を開始したい
  • 最新データ(最上位行)だけを取得して処理したい

といった業務でよく利用されます。

しかし、通常の Range("A2") のような指定では、フィルターで非表示になっている行も対象になってしまいます。
そのため、「可視セル(表示されている行)」の中から一番上の行を正確に取得する方法を理解しておくことが大切です。

本記事では、VBAでオートフィルター後の先頭行を取得する方法を、基礎から応用まで分かりやすく解説します。

✅ オートフィルタ後の先頭行を取得する考え方

VBAで「抽出後の先頭行」を取得するためには、
表示されているセル(可視セル)を対象にする必要があります。

ここで使うのが、

.SpecialCells(xlCellTypeVisible)

というメソッドです。

これを使うことで、
非表示行を除いた「実際に画面に表示されているセル」だけを扱うことができます。


基本構文

Range("範囲").SpecialCells(xlCellTypeVisible)

これにより、オートフィルターで表示されているセルのみを抽出できます。
さらに、そこから「最初のセル」を指定すれば、先頭行の値やアドレスを取得できるようになります。

参考:【VBA】条件に一致するセルを取得する方法|Find・For Each・SpecialCells


✅ 実践例①:抽出結果の先頭セルを取得する基本コード

まずは、最も基本的な「先頭行(最初に表示されたデータ)」を取得する方法です。


コード例

Sub GetFirstVisibleRow()
    Dim rngVisible As Range
    Dim firstCell As Range

    '--- フィルターを設定 ---
    Range("A1:C100").AutoFilter Field:=2, Criteria1:="営業部"

    '--- 可視セルを取得(ヘッダーを除く) ---
    On Error Resume Next
    Set rngVisible = Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    '--- 可視セルが存在するか確認 ---
    If rngVisible Is Nothing Then
        MsgBox "条件に一致するデータがありません。"
        ActiveSheet.AutoFilterMode = False
        Exit Sub
    End If

    '--- 最初のセルを取得 ---
    Set firstCell = rngVisible.Areas(1).Cells(1)
    MsgBox "先頭のセルは " & firstCell.Address & " です。"

    '--- フィルター解除 ---
    ActiveSheet.AutoFilterMode = False
End Sub

処理の流れ

  1. A1:C100の範囲にオートフィルターを設定
  2. 「営業部」に一致するデータを抽出
  3. 表示されているセル(可視セル)を取得
  4. .Areas(1).Cells(1)で、最初に表示されているセルを特定
    参考:【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)
  5. アドレスをメッセージで表示

出力例

先頭のセルは $A$5 です。

このように、フィルター後の最初の行のセルアドレスを簡単に取得できます。


✅ 実践例②:先頭行の値を取得する

先頭行のアドレスだけでなく、「値(データ)」を取得したい場合もあります。
その場合は、Valueプロパティを追加するだけです。


コード例

Sub GetFirstFilteredValue()
    Dim rngVisible As Range
    Dim firstCell As Range
    Dim firstValue As Variant

    '--- フィルターを設定 ---
    Range("A1:C100").AutoFilter Field:=2, Criteria1:="開発部"

    '--- 可視セルを取得(ヘッダー除外) ---
    On Error Resume Next
    Set rngVisible = Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If rngVisible Is Nothing Then
        MsgBox "条件に一致するデータがありません。"
        ActiveSheet.AutoFilterMode = False
        Exit Sub
    End If

    '--- 先頭セルを取得 ---
    Set firstCell = rngVisible.Areas(1).Cells(1)
    firstValue = firstCell.Value

    '--- 結果を表示 ---
    MsgBox "先頭の値は「" & firstValue & "」です。"

    ActiveSheet.AutoFilterMode = False
End Sub

解説


応用例

「先頭行の社員名をメール本文に自動挿入」「先頭データのIDをログ出力」などにも活用できます。


✅ 実践例③:先頭行全体を取得して別シートに転記

「行単位」で先頭データを取得したい場合は、行全体を取得する方法が効果的です。


コード例

Sub CopyFirstVisibleRow()
    Dim wsSrc As Worksheet
    Dim wsDst As Worksheet
    Dim rngVisible As Range
    Dim firstRow As Range

    Set wsSrc = Sheets("データ")
    Set wsDst = Sheets("結果")

    wsDst.Cells.Clear

    '--- フィルターを設定 ---
    wsSrc.Range("A1:C100").AutoFilter Field:=3, Criteria1:=">=100"

    '--- 可視セルを取得(ヘッダー除外) ---
    On Error Resume Next
    Set rngVisible = wsSrc.Range("A2:C100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If rngVisible Is Nothing Then
        MsgBox "条件に一致するデータがありません。"
        wsSrc.AutoFilterMode = False
        Exit Sub
    End If

    '--- 先頭行を取得 ---
    Set firstRow = rngVisible.Areas(1).Rows(1)

    '--- 結果シートにコピー ---
    firstRow.Copy wsDst.Range("A1")

    MsgBox "抽出結果の先頭行を転記しました。"

    wsSrc.AutoFilterMode = False
End Sub

処理の流れ

  1. 「C列の値が100以上」という条件で抽出
  2. フィルター後の表示データから最初の行を取得
  3. 別シートにコピー
    参考:【VBA】特定の文字を含む列の処理:検索・削除・別シートにコピー
  4. 「条件に一致する最初のデータ」だけを抜き出す

実務での使いどころ




✅ 実践例④:先頭行の行番号を取得する

「行番号」だけを取得したい場合は、Rowプロパティを使います。


コード例

Sub GetFirstVisibleRowNumber()
    Dim rngVisible As Range
    Dim firstCell As Range

    Range("A1:C100").AutoFilter Field:=2, Criteria1:="総務部"

    On Error Resume Next
    Set rngVisible = Range("A2:A100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If rngVisible Is Nothing Then
        MsgBox "データがありません。"
        ActiveSheet.AutoFilterMode = False
        Exit Sub
    End If

    Set firstCell = rngVisible.Areas(1).Cells(1)
    MsgBox "先頭行の行番号は " & firstCell.Row & " 行目です。"

    ActiveSheet.AutoFilterMode = False
End Sub

出力例

先頭行の行番号は 12 行目です。

この行番号を使えば、後続の処理で特定セルを参照したり、条件付きの更新が可能です。

参考:【VBA】最終行番号を取得する方法


✅ よくあるエラーと対策

問題原因対処法
実行時エラー1004フィルター後に該当データがないOn Error Resume NextIf rng Is Nothingを使用
先頭セルが正しく取得できない.Areas(1).Cells(1)を使っていないAreasで複数範囲に対応
フィルター解除後に動作しないAutoFilterModeが残っている処理後に ActiveSheet.AutoFilterMode = False

✅ 実務での応用:抽出結果の先頭行をログに残す

例えば、毎日の処理で「最新データの先頭行だけをログシートに記録」したい場合に有効です。


コード例

Sub LogFirstFilteredRow()
    Dim wsData As Worksheet
    Dim wsLog As Worksheet
    Dim rngVisible As Range
    Dim firstRow As Range
    Dim nextRow As Long

    Set wsData = Sheets("データ")
    Set wsLog = Sheets("ログ")

    wsData.Range("A1:C100").AutoFilter Field:=1, Criteria1:="<>"

    On Error Resume Next
    Set rngVisible = wsData.Range("A2:C100").SpecialCells(xlCellTypeVisible)
    On Error GoTo 0

    If rngVisible Is Nothing Then
        MsgBox "該当データがありません。"
        wsData.AutoFilterMode = False
        Exit Sub
    End If

    Set firstRow = rngVisible.Areas(1).Rows(1)
    nextRow = wsLog.Cells(Rows.Count, 1).End(xlUp).Row + 1

    wsLog.Range("A" & nextRow).Value = Now
    wsLog.Range("B" & nextRow & ":D" & nextRow).Value = firstRow.Value

    MsgBox "先頭データをログに記録しました。"

    wsData.AutoFilterMode = False
End Sub

実務シーン

  • 当日最初の販売データを記録
  • 最新の申請情報を監視ログに追加
  • 自動集計処理の実行記録を残す

✅ まとめ:オートフィルタの先頭行を取得できれば処理の自動化が加速する

  • .SpecialCells(xlCellTypeVisible)で可視セルを取得する
  • .Areas(1).Cells(1)で先頭行を特定できる
  • .Rowで行番号、.Valueで値を取得可能
  • 別シート転記・ログ出力・自動判定など応用範囲が広い
  • エラー制御(On Error Resume NextIf rng Is Nothing)で安全なコードに

VBAでオートフィルターの先頭行を取得できるようになると、
「最新データだけを処理する」「抽出結果の一部だけ扱う」などの業務自動化が大幅に進みます。

レポートや定期出力のマクロにも応用できるため、
ぜひこの記事のサンプルをベースに、あなたの実務に合った処理を組み込んでみてください。

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