VBAでExcel表に対してフィルターをかけて、可視行のみをループするサンプルコードを紹介します。
仕様
VBAによりExcel表に対して、以下の処理を実行します。
処理内容
- フィルターをクリアします。
- 既に違う条件でフィルタがかかっていたら誤動作する可能性があるため。
- 特定の条件でフィルタを絞り込む。
- 例として、年齢が20代の方で絞り込みます。
- 可視行のみをループして、可視行に対して何らかの処理します。
- 例として、可視行の名前列を抽出しメッセージボックスで表示します。
今回は以下のようなサンプルExcelファイルを用意します。

ソースコード
VBAのエディタで以下のコードを記述します。
Option Explicit
Sub getTwentiesName()
'シートの指定
Dim wSheet As Worksheet
Set wSheet = Worksheets("Sheet1")
'フィルタをクリア
If wSheet.FilterMode = True Then
wSheet.ShowAllData
End If
'フィルタで年齢列を絞り込み(20代のみ)
wSheet.Range("A1").AutoFilter Field:=3, Criteria1:=">=20", Operator:=xlAnd, Criteria2:="<30"
'可視行のみループ
Dim names As String
Dim visibleRange As Range
For Each visibleRange In visibleRangeArea(Range("A2"))
names = names + visibleRange.Cells(1, 2).Value & vbCrLf
Next
MsgBox names
End Sub
'可視範囲の取得関数
Function visibleRangeArea(StartRange As Range) As Range
With StartRange.CurrentRegion
'指定範囲全体を1行下にずらし、行数を1行減らす(見出しを削るため)
Set visibleRangeArea = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows
End With
End Function
処理が長くなるので、可視範囲の表の取得は別関数のvisibleRangeArea()で処理します。
最初からフィルタがかかっていることを前提に処理する場合、以下の部分はコメントアウトしてよいかと思います。
- フィルタをクリア
- フィルタで年齢列を絞り込み(20代のみ)
実行
実行手順
Alt + F8でマクロの一覧から、先ほどのマクロ関数を選択して実行します。

実行結果
マクロの実行ボタンを押下しました。
すると、20代の人でフィルタされ、フィルタされた人の名前が抽出されました。

参考情報
環境
下記の環境で作成・実行しております。
No. | 環境 | バージョン |
---|---|---|
1 | OS | Windows11 |
2 | Excel | Excel2016 |
以上です。