[Excel VBA] オートフィルタ適用後に表示されている行のみを対象に処理を行う

データを処理する際に、オートフィルタで見えてる行だけを対象に処理を行いたい場合があるんです。
このようなデータはデータベースで処理を行う方が効率がいいのですが...
それはさておき、ユーザーがフィルタした後にと言うこともありますからね。

Excel で 表示されているセルだけを対象にしたい場合、SpecialCells(xlCellTypeVisible) を使用します。
オートフィルタで絞り込まれた範囲を対象に表示されているセルを取得するコードは以下のようになります。

.AutoFilter.Range.SpecialCells(xlCellTypeVisible)

ただ、これをそのまま使用すると行単位で処理を行いたい場合には、1行につき対象列数と同じ回数だけ引っかかりますので、この挙動への対応を検討する必要があります。
列数分引っかかるのは列が複数あるからですので、1列であれば1回で問題はないはずです。
なので、対象の列を1列目に限定します。限定すると以下のようになります。

.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)

上記の状態では対象は各セルですので、列全体を処理したいときには行番号を取得したほうが、セル範囲指定などの場面で有利です。その行番号の取得には Row メンバを使用します。

処理全体では、以下のようになります。

Sub 見えている行だけを対象に()
    With ActiveSheet
        ' Filter
        .AutoFilter
        .AutoFilter フィルター式...
        
        ' Search
        For Each c In .AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible)
            MsgBox "表示されているデータの行番号は" & c.Row "です。"
        Next c
    End With
End Sub

コメント (0件)


くろねこ研究所
https://www.blackcat.xyz/article.php/ProgFAQ-Xls_ProcessToCellAfterAutoFill