PR

【Excel VBA】オートフィルタで絞込み後のデータを操作する方法/すべて選択・解除

エクセルVBA-オートフィルタで絞り込んだデータの操作 VBA

エクセルVBAでオートフィルタを使用して絞込んだデータを操作する方法や、すべて選択する方法・オートフィルタを解除する方法についてご紹介します。

絞込み方法と並び替えについては別の記事で書いていますので「オートフィルタについての関連記事」をクリックしてご覧ください。

スポンサーリンク

オートフィルタで絞り込まれているかを判定する

次はオートフィルタで絞込みが設定されているかどうかを判定する方法についてです。
以下は絞り込みが行われているかを判定してメッセージを表示している例です。

「ActiveSheet.FilterMode」がTrueかどうかをIfで判定して、メッセージを分岐させています。

'<フィルタで絞込み設定がされているかを判定>
    If ActiveSheet.FilterMode = True Then
        MsgBox "絞り込まれています"
    Else
        MsgBox "絞り込まれていません"
    End If
スポンサーリンク

オートフィルタで「すべて選択」する(すべて表示)

オートフィルタで絞込み設定を「すべて選択」にして、全データを表示させたい場合についてです。
左の図ように今絞込みが設定されている表に対して実行すると、右の図のようにフィルタは設定されたままでデータはすべて表示された状態となります。

フィルタで絞込みされている場合、「すべて表示」させたい場合は「ShowAllData」メソッドを使用してデータを表示させます。

'<フィルタで絞込み設定が設定されている場合、フィルタですべて表示させる>

    If ActiveSheet.FilterMode = True Then
        ActiveSheet.ShowAllData
    End If
スポンサーリンク

オートフィルタを解除する

今度はフィルタの設定自体を解除したい場合についてです。
左のように今絞込みが設定されている表に対して、実行すると右のようにフィルタ設定の▽がない状態になります。絞り込んでいた設定もなくなります。

フィルタで絞込みがされている場合、「.AutoFilter」メソッドを使用するとフィルタ解除することができます。(フィルタを設置するときと同じ記述。)

'<フィルタで絞込み設定されている場合、フィルタ自体を解除する>

If ActiveSheet.FilterMode = True Then
    ActiveSheet.Range("A1").AutoFilter
End If
スポンサーリンク

オートフィルタで絞込み後のデータ件数をカウント

オートフィルタでデータの絞込みをした後に、絞り込まれたデータが何件か知りたい場合があると思います。
下の例ではA列の分類を「魚」で絞込んでいます。
絞込み後のデータ数は4件あり、データ数をメッセージで表示させています。

絞込み後のデータをカウントする場合はWorksheetFunctionのSubtotal関数を使用してカウントします。カウントした値を変数「DataCnt」に入れて、ヘッダー分を引くためマイナス1して算出しています。

Dim DataCnt As Integer

'<絞込み後のデータ件数をカウント>
'オートフィルタで絞込み(1列目が「魚」)
ActiveSheet.Range("A1").AutoFilter 1, "魚"

'絞込み後の件数を変数に格納する
DataCnt = WorksheetFunction.Subtotal(3, Range("A1").CurrentRegion.Columns(1))

'データ件数をメッセージボックスに表示
MsgBox "絞込み後のデータ件数:" & DataCnt - 1

Range("A1").CurrentRegion.Copy Sheets("Sheet2").Range("A1")
スポンサーリンク

オートフィルタで絞込み後のデータをコピー

絞り込まれたデータをコピーして他のシートに貼り付ける作業をやってみたいと思います。

下の例ではSheet1でA列の分類を「魚」で絞り込んで、絞込み後のデータ範囲をコピーし、Sheet2のA1セルに貼り付けています。ヘッダーと魚のデータ4行だけがコピーされていることが分かります。

「Range(“A1”).CurrentRegion」でA1セルのカレント範囲(見えている行のみ)を指定してコピーしています。

'<絞込み後のデータ範囲をコピー>
'オートフィルターで絞込み(1列目が「魚」)
ActiveSheet.Range("A1").AutoFilter 1, "魚"

'絞り込んだ結果をコピーし、Sheet2に貼り付け
ActiveSheet.Range("A1").CurrentRegion.Copy Worksheets("Sheet2").Range("A1")
スポンサーリンク

オートフィルタで絞り込んだ行をループし操作する

オートフィルタで絞り込まれている状態で見えている(選択されている)行のみをループして操作したい場合についての説明です。

下の例ではまずC列の販売数を100以上で絞り込んでいます。
2行目、6行目、7行目、10行目、11行目が選択されている状態です。

このフィルタで選択されている行を対象にループ処理を行い、商品名を取得してメッセージボックスに表示させてみたいと思います。

Sub Sample()

    Dim b As Range
    Dim str As String
    
    '販売数が100よりも大きいデータで絞込み
    ActiveSheet.Range(Cells(1, 1), Cells(13, 3)).AutoFilter 3, ">100"
    
    'A1セルから始まる表の範囲を対象とする
    With ActiveSheet.Range("A1").CurrentRegion.Offset(1, 0)
       
        '絞り込んだ行の範囲を変数「b」に代入する
        For Each b In .Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible).Rows
           
            '変数「b」の行範囲の左端から2列目の値を変数に格納し、うしろにカンマをつける
            str = str & b.Cells(1, 2) & ","
        
        Next b
    
    End With
    
    'メッセージを表示
    MsgBox str

End Sub

▽実行後に表示されるメッセージボックス

フィルタで選択されている行の商品名「ラーメン,いわし,サバ,にんじん,玉ねぎ」がメッセージに表示されました。

スポンサーリンク

オートフィルタについての関連記事

オートフィルタで絞り込む方法については↓の記事で説明しています。

オートフィルタを使用したデータの並び替えについては↓の記事で説明しています。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。

タイトルとURLをコピーしました