オートフィルターの使い方

中級VBA

オートフィルターの使い方

 ExcelVBAを使わない方でもオートフィルターの機能は良く使うという方は多いと思います。
 オートフィルターは大変便利なのでぜひ使って欲しい機能です。

 ある程度使い方が決まっているのであれば、ExcelVBAで処理を自動化したいと考えると思います。
 ここではオートフィルターの使い方を解説します。
 少々面倒な仕様もあるので、初心者の方でも躓かないように丁寧に見ていきます。

オートフィルターの設定と解除

 オートフィルターはシート全体でON・OFFを切り替えるイメージです。

Sub test1()
    'オートフィルタの設定・解除を切り替える
    Range("B2").AutoFilter
End Sub

 Rangeオブジェクトに対して、AutoFilter を実行すると、オートフィルターが設定されていれば解除し、設定されていなければRangeオブジェクトを含むエリアにオートフィルターが設定されます。
 設定されたかどうかは最初の項目に▼が表示されているかで確認できます。

オートフィルターが設定されているか確認する

 オートフィルターが設定されているかどうかを見て操作を決めたい場合は、シートオブジェクトのAutoFilterModeプロパティを見ればわかりますので、これで判断します。
 以下の例では、オートフィルターが設定されている場合のみ設定を解除する例です。

Sub test2()
    '設定されている場合は解除する
    If ActiveSheet.AutoFilterMode = True Then
        Range("B2").AutoFilter
    End If
End Sub

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

 オートフィルターの▼マークをクリックすると並べ替え(ソート)と抽出(フィルター)を行えるようになっています。 これらを操作すると▼の横にマークが出ます。

 オートフィルターの抽出や並べ替えを解除するには、 ShowAllDataメソッドを使います。
 (並べ替えに関しては並びがそのままでマークが解除されます。)
 ShowAllDataメソッドは、解除する対象(抽出や並べ替え)がない場合はエラーが出ます。
 このため予めフィルター(抽出)がされているか確認してから実行するようにします。
 確認するにはシートオブジェクトの FilterModeプロパティ を見るようにします。

Sub test3()
    'フィルタ(抽出)されている場合に解除
    If ActiveSheet.FilterMode = True Then
        ActiveSheet.ShowAllData
    End If
End Sub

※ちなみにオートフィルターに並べ替えが設定されている場合は、抽出が無くても ShowAllDataメソッドはエラーとなりません。
 ShowAllDataメソッドが実行されると、並べ替えマークも解除されます。

データの抽出

 オートフィルターで抽出を行うには、RangeオブジェクトのAutoFilterメソッドに引数を付けて指定します。
 第一引数には、対象とする列第二引数には抽出するデータを指定します。
 第一引数の列は、オートフィルター内での列番になります。

Sub testFilter()
    ActiveSheet.Range("B2").AutoFilter 1, "東京"
End Sub

複数の条件で抽出したい時

 複数のデータで抽出したい場合は以下のように配列を指定することになります
 第一引数には、対象とする列第二引数には抽出するデータの配列。そして複数の条件抽出をするため第三引数xlFilterValues を指定します。

Sub testFilter2()
    Dim arr(2)
    arr(0) = "北海道"
    arr(1) = "東京"
    arr(2) = "愛知"
    
    ActiveSheet.Range("B2").AutoFilter 1, arr, xlFilterValues
End Sub

数値データを扱う 

 数値データを扱う場合は、=、<>、>、< などの演算子を付けて扱うことができます。

Sub testFilter3()
    ActiveSheet.Range("B2").AutoFilter 2, ">20" '気温が20より大きいもの
End Sub

 2つの条件を組み合わせたい場合は、xlAndxlOr を使って以下のように書くことができます

Sub testFilter4()

                              '気温が20より大きく24より小さい
    ActiveSheet.Range("B2").AutoFilter 2, ">20", xlAnd, "<24"
End Sub

 文字列データで行ったような方法で書く事も可能です。

Sub testFilter6()
    Dim arr(2)
    arr(0) = "12"
    arr(1) = "22"
    arr(2) = "24"
    
    ActiveSheet.Range("B2").AutoFilter 2, arr, xlFilterValues
End Sub

データの並べ替え

 並べ替えは、Rangeオブジェクトの Sortメソッドを使用します。
 
 引き数のSort key1には、ソートしたい列を指定します。
 
 order1は、昇順降順かをしています。
 昇順は、xlAscending降順は、xlDescendingを指定します。

 Headerは、一行目を見出しにするかどうかを指定します。
 xlYesで一行目を見出しとします。

Sub testSort昇順()
    With ActiveSheet
        .Range("B2").Sort key1:=.Range("D2"), _
                            order1:=xlAscending, _
                            Header:=xlYes
    End With
End Sub

Sub testSort降順()
    With ActiveSheet
        .Range("B2").Sort key1:=.Range("D2"), _
                            order1:=xlDescending, _
                            Header:=xlYes
    End With
End Sub

(見やすいように、空白+_ で改行しています。 _ を抜いて一行で書いても構いません。)

結果の転記

 フィルターをかけた状態で他の場所にコピー&ペーストしたい場合は、
 CurrentRegion を使ってコピーするのが最も簡単な方法です。
 以下に例を示します。

Sub test転記()
    'フィルタ(抽出)されている場合に解除
    If ActiveSheet.FilterMode = True Then
        ActiveSheet.ShowAllData
    End If
    
    ActiveSheet.Range("B2").AutoFilter 2, "<23"
        
    ActiveSheet.Range("B2").CurrentRegion.Copy

    Worksheets("Sheet2").Range("B2").PasteSpecial Paste:=xlPasteAll
End Sub

最後に

 オートフィルターのソート(並べ替え)に関してですが、原本の並びを元に戻すような機能はありませんので、再現させたい場合は、値をコピーしてから加工するか、順番を示す序数の項目を追加するなど工夫が必要になります。

 ソートや抽出は、プログラミング上で行うのは結構面倒なので、ExcelVBAでは、シート上にデータを配置してオートフィルターを使う事が良くあります。
 使い方のコツを覚えれば比較的簡単に使えると思いますので是非チャレンジしてみてください。

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