VBAでExcel表に対してフィルターをかけて、可視行のみをループするサンプルコード

VBA
記事内に広告が含まれています。

VBAでExcel表に対してフィルターをかけて、可視行のみをループするサンプルコードを紹介します。

《広告》

仕様

VBAによりExcel表に対して、以下の処理を実行します。

処理内容
  1. フィルターをクリアします。
    既に違う条件でフィルタがかかっていたら誤動作する可能性があるため。
  2. 特定の条件でフィルタを絞り込む。 
    例として、年齢が20代の方で絞り込みます。
  3. 可視行のみをループして、可視行に対して何らかの処理します。
    例として、可視行の名前列を抽出しメッセージボックスで表示します。

今回は以下のようなサンプル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.環境バージョン
1OSWindows11
2ExcelExcel2016
環境一覧

以上です。