目次
目的
- オートフィルタを掛けたい。
- オートフィルタが掛かっているかどうかを調べたい。
オートフィルタを掛ける、かける、どちらの字で書いた方が良いのか分かりません。
オートフィルタモードにしてみる
Excel では以下の画像のような操作になると思います。
VBA での操作を試してみます。
- 下記の状態でテストしてみます。
- 下記 URL に元データをアップロードしてあります。タブ区切りのテキストファイルになっています。
https://pulogu.net/wordpress/wp-content/uploads/2024/02/sample.txt- 上記 URL のデータをすべてコピー。
- Excel の A1 セルを右クリック。
- 「形式を選択して貼り付け」をクリック。
- 「HTML」「unicode テキスト」「テキスト」の中から「テキスト」をクリック。
- A1:C6 の範囲にデータがコピーされる。
- 下記マクロを実行してみます。
Sub オートフィルタモードになっているかを調べる()
Debug.Print Worksheets(1).AutoFilterMode
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- オートフィルタモードにしてみます。
Sub オートフィルタモードにしてみる()
Range("A1:C6").AutoFilter
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- 上記 3 のマクロを再度実行してみます。
- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- 上記 3 のマクロをもう一度実行してみます。
- 実行結果は以下のようになりました。
-
上記 3 のマクロを実行する度にオートフィルタモードの ON / OFF が切り替わりました。
- 実行結果は以下のようになりました。
- オートフィルタモードになっている状態で、再度、AutoFilterMode プロパティを取得してみます。
Sub 再度AutoFilterModeプロパティを取得()
Debug.Print Worksheets(1).AutoFilterMode
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- AutoFilterMode プロパティは False を設定できるようです。
Sub AutoFilterModeをfalseに設定してみる()
Worksheets(1).AutoFilterMode = False
End Sub- 実行結果は以下のようになりました。
- AutoFilterMode = True に設定しようとするとエラーが発生しました。False のみ設定可能なようです。
- 実行結果は以下のようになりました。
各列にフィルタを掛ける
Excel では以下の画像のような操作になると思います。
VBA での操作を試してみます。
- 下記の状態でテストしてみます。
- 下記マクロを実行してみます。
Sub 一列目数値3以上()
Range("A1:C6").AutoFilter 1, ">=3"
End Sub- 「AutoFilter 1」
「1」はオートフィルタの範囲「A1:C6」の 1 列目という意味です。 - 「">=3"」
3 以上という意味です。 - 実行結果は以下のようになりました。
- 「AutoFilter 1」
- ここで FilterMode プロパティの値を取得してみます。
Sub 非表示の行があるかどうかを取得()
Debug.Print Worksheets(1).FilterMode
End Sub- FilterMode
非表示の行がある場合「True」を返すようです。上記で 1 列目にフィルタを掛けたので「True」が返ってくる予定です。 - 実行結果です。
- FilterMode
- 一列目に掛けたフィルタを解除してみます。
Sub 一列目すべて表示()
Range("A1:C6").AutoFilter 1
End Sub- 実行結果です。
- 実行結果です。
- ここでもう一度 FilterMode プロパティの値を取得してみます。
Sub すべてのデータが表示されている状態でFilterModeを取得()
Debug.Print Worksheets(1).FilterMode
End Sub- 実行結果です。
- 実行結果です。
- AND で複数の条件に一致するデータのみ表示してみます。
Sub 一列目_数値3以上で4以下()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4"
End Sub- xlAnd
OR の場合は定数「xlOr」を指定するようです。 - 実行結果です。
- マウス、キーボードで操作する場合、以下のような画面で同じ事をできると思います。
- xlAnd
- 1 から 3 列目に同時にフィルタを掛けてみます。
Sub 一列目2以上_二列目C以外_三列目Bで始まる文字()
Range("A1:C6").AutoFilter 1, ">=2"
Range("A1:C6").AutoFilter 2, "<>C"
Range("A1:C6").AutoFilter 3, "b*"
End Sub- 「AutoFilter 2」「AutoFilter 3」
オートフィルタを掛けている範囲「A1:C6」の 2 列目、3 列目という意味です。 - 「b*」
文字「b」と「*」アスタリスクを記述しています。「*」はその部分に複数の文字があることを表現しています。 - 実行結果です。
- 「AutoFilter 2」「AutoFilter 3」
- 1 から 3 列目のデータを順番に表示してみます。
Sub 一二三列目全て表示()
Range("A1:C6").AutoFilter 1
Range("A1:C6").AutoFilter 2
Range("A1:C6").AutoFilter 3
End Sub- 実行結果です。
- 実行結果です。
- 2 列目の空白セルのみ表示してみます。元データは 3,5 行目が空白セルになっています。
Sub 二列目空白()
Range("A1:C6").AutoFilter 2, "="
End Sub- 実行結果です。
- 実行結果です。
- 2 列目の空白セル以外を表示してみます。2,4,6 行目が表示される予定です。
Sub 二列目空白以外のフィルタ()
Range("A1:C6").AutoFilter 2, "<>"
End Sub- 実行結果です。
- 実行結果です。
AutoFilter オブジェクト
上記では「Raneg("A1:C6").AutoFilter」のように Range オブジェクトの AutoFilter "メソッド" を使用しましたが、Worksheet オブジェクトの AutoFilter "プロパティ" で「AutoFilter オブジェクト」というものを取得できるようです。
- オートフィルタモードになっている状態でテストしてみます。
- 下記マクロを実行してみます。
Sub AutoFilterオブジェクト取得()
Dim a
Set a = Worksheets(1).AutoFilter
Debug.Print TypeName(a)
Debug.Print VarType(a) '9 は vbObject
End Sub- Worksheets(1).AutoFilter
Worksheets オブジェクトの AutoFilter プロパティで AutoFilter オブジェクトを取得しています。 - 実行結果は以下のようになりました。
- オートフィルタモードになっていない場合は Nothing を返すようです。
- Worksheets(1).AutoFilter
- オートフィルタのセル範囲のアドレスを取得してみます。
Sub オートフィルタのデータ範囲取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Range.Address
End Sub- Dim a As AutoFilter
「a」「.(ピリオド)」と続けて入力すると、入力候補が出てきて便利なので、AutoFilter として宣言しています。 - 実行結果は以下のようになりました。
- Dim a As AutoFilter
- フィルタの数を取得してみます。
Sub フィルタの数を取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Filters.Count
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- 上記で実行したマクロですが、下記マクロを実行してみます。
Sub 一列目_数値3以上で4以下_二回目()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4"
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- 各列にフィルタが掛かっているかどうかを取得してみます。
Sub 各列のフィルタの状態()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Filters.Item(1).On
Debug.Print a.Filters.Item(2).On
Debug.Print a.Filters.Item(3).On
End Sub- 「.Item(1)」
1 列目は (1) になります。2,3 列目は (2),(3) になります。 - 「.On」
フィルタが掛かっている状態だと「true」を返すようです。下向き矢印が青くなっていると「true」を返すのだと思います。 - 実行結果は以下のようになりました。
- 「.Item(1)」
- 1 列目のフィルタの条件を取得してみます。
Sub 一列目のフィルタの条件を取得()
Dim a As AutoFilter
Set a = Worksheets(1).AutoFilter
Debug.Print a.Filters.Item(1).Criteria1
Debug.Print a.Filters.Item(1).Criteria2
Debug.Print a.Filters.Item(1).Operator
End Sub- 「.Criteria1」「.Criteria2」
フィルタの 1 つ目の条件と 2 つ目の条件です。
- 「.Operator」
AND,OR などの条件が定数で返ってくるようです。xlAnd = 1 , xlOr = 2 など。 - 実行結果は以下のようになりました。
- 上記マクロの「Item(1)」の「1」を「2」「3」に変更すると下記のエラーが発生しました。2,3 列目にはフィルタが掛かっていないのでエラーになったようです。
フィルタ条件を「Criteria1」のみ設定して「Criteria2」を取得しようとしても同じエラーが発生しました。
- 「.Criteria1」「.Criteria2」
結果を操作する
オートフィルタを掛けた結果、表示されるデータがあると思いますが、そのデータを操作してみます。
表示されているデータの取得を行ってみます。
- 下記の状態でテストしてみます。
- オートフィルタを掛けてみます。
Sub 二列目が空白以外でフィルタを掛ける()
Range("A1:C6").AutoFilter 2, "<>"
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- 表示されているセルをループ処理してみます。
Sub オートフィルタの結果をループする()
Dim a As Range
For Each a In Range("A2:C6").SpecialCells(xlCellTypeVisible)
Debug.Print a
Next
End Sub- 実行結果は以下のようになりました。
- Range("A2:C6")
見出し以外の範囲をループ処理する予定です。 - SpecialCells(xlCellTypeVisible)
Range("A2:C6") の中の可視セル(Visible)のみを取得しています。
- 実行結果は以下のようになりました。
- Range("A2:C6").SpecialCells(xlCellTypeVisible) が返す範囲を取得してみます。
Sub xlCellTypeVisibleが返す範囲()
Debug.Print Range("A2:C6").SpecialCells(xlCellTypeVisible).Address
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- cells.SpecialCells(xlCellTypeVisible) が返す範囲を取得してみます。
Sub cells_xlCellTypeVisibleが返す範囲()
Debug.Print Cells.SpecialCells(xlCellTypeVisible).Address
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
次は、行単位の操作を試してみます。
- 下記マクロを実行してみます。
Sub オートフィルタの結果を行単位で操作()
Debug.Print Range("A2:C6").SpecialCells(xlCellTypeVisible).EntireRow.Address
End Sub- 実行結果は以下のようになりました。
- 「.(ドット)」EntireRow
「.」の前までで指定したセルを含む複数行を取得できます。
- 実行結果は以下のようになりました。
- 行を削除してみます。
Sub オートフィルタの結果を行単位で削除()
Range("A2:C6").SpecialCells(xlCellTypeVisible).EntireRow.Delete
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
- オートフィルタを解除してみます。
Sub オートフィルタを解除()
Sheet1.AutoFilterMode = False
End Sub- 実行結果は以下のようになりました。
- Sheet1
「シート1」のオブジェクト名を使用しています。普通の Worksheets(1) でも良いと思います。
各シートのオブジェクト名は VBE で見る事が出来ます。
- 実行結果は以下のようになりました。
- ワークシートのオブジェクト名は下記のようなマクロで取得することも出来るようです。
Sub ワークシート1のコード名取得()
Debug.Print Worksheets(1).CodeName
End Sub- 実行結果は以下のようになりました。
- 実行結果は以下のようになりました。
マクロストック
Sub 一列目の下向き矢印を非表示にする()
Range("A1:C6").AutoFilter 1, ">=3", xlAnd, "<=4", False
End Sub
第 5 引数「VisibleDropDown」を「False」に設定しています。
テスト環境
- Windows 10(64 ビット)
- Microsoft Office Excel 2003
以上、閲覧ありがとうございました。