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
処理の流れ
- A1:C100の範囲にオートフィルターを設定
- 「営業部」に一致するデータを抽出
- 表示されているセル(可視セル)を取得
.Areas(1).Cells(1)
で、最初に表示されているセルを特定
参考:【VBA】(セル内)特定の文字の最初の位置を検索(InStr関数の使用方法)- アドレスをメッセージで表示
出力例
先頭のセルは $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
解説
.Areas(1).Cells(1)
で先頭セルを抽出.Value
でそのセルの内容(値)を取得
参考:【VBA】"value 型が一致しません"エラー(Value型)の原因と対処方法- 結果をMsgBoxで確認可能
応用例
「先頭行の社員名をメール本文に自動挿入」「先頭データの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
処理の流れ
- 「C列の値が100以上」という条件で抽出
- フィルター後の表示データから最初の行を取得
- 別シートにコピー
参考:【VBA】特定の文字を含む列の処理:検索・削除・別シートにコピー - 「条件に一致する最初のデータ」だけを抜き出す
実務での使いどころ
- 最新データ(最上位行)を抽出して報告書に貼り付け
- 抽出結果の代表値だけを別表に出力
- 特定条件での最初の一致データを検証
参考:【VBA】If文を使って次の処理へ進む方法|条件分岐・スキップ・中断の実例解説
✅ 実践例④:先頭行の行番号を取得する
「行番号」だけを取得したい場合は、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 行目です。
この行番号を使えば、後続の処理で特定セルを参照したり、条件付きの更新が可能です。
✅ よくあるエラーと対策
問題 | 原因 | 対処法 |
---|---|---|
実行時エラー1004 | フィルター後に該当データがない | On Error Resume Next +If 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 Next
+If rng Is Nothing
)で安全なコードに
VBAでオートフィルターの先頭行を取得できるようになると、
「最新データだけを処理する」「抽出結果の一部だけ扱う」などの業務自動化が大幅に進みます。
レポートや定期出力のマクロにも応用できるため、
ぜひこの記事のサンプルをベースに、あなたの実務に合った処理を組み込んでみてください。