たくさんの列・フィールドが存在しているワークシートで、オートフィルター機能を駆使してデータの抽出を行っていると、どのフィールドで絞り込みを行っているのか、わかりにくくなることがあります。
そんなときに使うための、フィルターをかけているフィールド名を調べるExcelマクロを作ってみました。
フィルターをかけているフィールド名を取得するサンプルマクロ
フィルターのかかっているワークシートがアクティブな状態で以下のマクロを実行すると、フィルターに利用しているフィールドの名前がメッセージボックスに表示されます。
Dim aft As AutoFilter
Dim fld As String ' フィールド名
Dim i As Long
If Not ActiveSheet.FilterMode Then Exit Sub
Set aft = ActiveSheet.AutoFilter
For i = 1 To aft.Filters.Count
If aft.Filters(i).On Then
fld = fld & _
aft.Range.Cells(1, i).Value & vbCrLf
End If
Next i
MsgBox fld
End Subサンプルマクロの解説
ワークシート上のオートフィルターを表すAutoFilterオブジェクトを、オブジェクト変数・aftにセットしておいて、
Set aft = ActiveSheet.AutoFilter
ワークシート上にフィルターをかけるための[▼]ボタンが、表示されているフィールド・列の数だけFor~Nextループを回して、
For i = 1 To aft.Filters.Count
実際にフィルターがかけられている列だったときに、その列名を変数・fldに格納しています。
If aft.Filters(i).On Then
fld = fld & _
aft.Range.Cells(1, i).Value & vbCrLf
フィールド名・列名を簡単に取得できるプロパティが、Filterオブジェクトに用意されていても良さそうに感じるかもしれませんが、
Excelは元来データベースソフトではなく表計算ソフトですから、そのようなプロパティは用意されていません。
そのため、AutoFilterオブジェクトのRangeプロパティで、
オートフィルターの対象となっているセル範囲を取得して、RangeオブジェクトのCellsプロパティを利用して、フィールド名を取得する「aft.Range.Cells(1, i).Value」というオブジェクト式にしています。
Home » エクセルマクロ・Excel VBAの使い方 » Sheets・Worksheet » 抽出に利用しているフィールド名を取得するExcelマクロ