Excel VBA オートフィルターで抽出したデータの条件を取得する

スポンサーリンク
スポンサーリンク

オートフィルターで抽出したデータの条件を取得する方法

オートフィルターで、データが抽出されているかどうかは
AutoFilter【オートフィルター】オブジェクト
FilterMode【フィルターモード】プロパティで判定できますが

どの列が抽出されているかを判定するときは
AutoFilter【オートフィルター】オブジェクトの
Filters【フィルターズ】プロパティで取得した
各列のフィルターを表す
Filter【フィルター】オブジェクトの
On【オン】プロパティを使用して各列の抽出状態を判定します。

また、抽出条件は
Filter【フィルター】オブジェクトの
1つめの条件はCriteria1【クライテリアワン】プロパティ
2つめの条件はCriteria2【クライテリアトゥ】プロパティ
で取得できます。

各列のフィルターを表す
Filter【フィルター】オブジェクトの
抽出条件が1つなのか2つなのかは
条件式を表す
Operator【オペレーター】の値が0でなければ
2つの抽出条件が設定されていると判断します。

実行イメージ


コード例

Sub 条件確認()
Dim i As Long
Dim 条件 As String
With ActiveSheet.AutoFilter
For i = 1 To .Filters.Count
  With .Filters(i)
  If .On = True Then
      条件 = 条件 & i & "列目:"
   If .Operator <> 0 Then
   On Error Resume Next
       条件 = 条件 & .Criteria1 & .Criteria2 & vbCrLf
   Else
       条件 = 条件 & .Criteria1 & vbCrLf
   End If
 End If
 End With
Next i
End With
   MsgBox 条件
End Sub

コードの解説

2行目
【Dim i As Long】

フィルターが設定されている列数を格納する
繰り返し処理で使用する
カウンター変数の「i」を
長整数型(Long)で宣言します。


3行目
【Dim 条件 As String】

取得した条件を格納する
変数「条件」を
文字列型(String)で宣言します。


4行目
【With ActiveSheet.AutoFilter】

Worksheet【ワークシート】オブジェクトの
AutoFilter【オートフィルター】プロパティを使用して
ワークシート上のオートフィルターを表す
AutoFilter【オートフィルター】オブジェクトを参照して
Withステートメントで指定します。


5行目
【For i = 1 To .Filters.Count】

For Next【フォアネクスト】ステートメントを使用して
繰り返し処理の始まりです。
カウンター変数iに1から
withステートメントで指定した
AutoFilter【オートフィルター】オブジェクトの
フィルターの集まりを表す
Filters【フィルタース】コレクションの
Count【カウント】プロパティで取得した
フィルターが設定されている列数を
繰り返し処理の中で順次代入します。


6行目
【With .Filters(i)】

Withステートメントで指定した
AutoFilter【オートフィルター】オブジェクトの
Filters【フィルターズ】プロパティの引数に
カウンター変数iを設定して
繰り返し処理の中で各列のフィルターを表す
Filter【フィルター】オブジェクトを参照して
Withステートメントで指定します。


7行目
【If .On = True Then】

If【イフ】ステートメントを指定して
条件分岐をします。
Withステートメントで指定した
フィルターが設定されている各列を表す
Filter【フィルター】オブジェクトの
フィルターで抽出されているかどうかの値を返す
On【オン】プロパティを使用してTrueのとき
つまり、フィルターでデータが抽出されているときを定義します。


8行目
【条件 = 条件 & i & “列目:”】

抽出条件を格納する
変数「条件」に
変数「条件」に格納している値とカウンター変数「i」の値と
文字列の「列目:」を代入します。


9行目
【If .Operator <> 0 Then】

If【イフ】ステートメントを使用して
条件分岐をします。
Withステートメントで指定した
各列のフィルターを表す
Filter【フィルター】オブジェクトの
条件式を表す
Operator【オペレーター】プロパティの値が
0でないときを定義します。
つまり、抽出条件が2つあり抽出条件式が
設定されているときを定義します。


10行目
【On Error Resume Next】
On Error Resume Next【オンエラーリズームネクスト】ステートメント
使用してエラーが発生しても無視して
処理を続行させます。
フィルターで日付が抽出されている場合にエラーが発生します。


11行目
【条件 = 条件 & .Criteria1 & .Criteria2 & vbCrLf】

フィルターで抽出されている
列の列番号が格納されている
変数「条件」の内容と
Withステートメントで指定した
各列のフィルターを表す
Filter【フィルター】オブジェクトの
1つめの抽出条件を表す
Criteria1【クライテリアワン】プロパティと
2つめの抽出条件を表す
Criteria2【クライテリアトゥ】プロパティを使用して
各抽出条件を取得して最後に改行コードを記述し
各値を「&」アンパサンドで連結して
変数「条件」に代入します。


12行目
【Else
条件 = 条件 & .Criteria1 & vbCrLf】

Else【エルズ】キーワードを使用して
条件が成立しなかった場合
つまり、条件式を表す
Operator【オペレーター】プロパティの値が0で
条件式が無い場合(抽出条件が1つの場合)
フィルターで抽出されている列番号が格納されている
変数「条件」と
Withステートメントで指定した
各フィルターが設定されている列を表す
Filter【フィルター】オブジェクトの
1つめの抽出条件を表す
Criteria1【クライテリアワン】プロパティを使用して
各抽出条件を取得して最後に改行コードを記述し
各値を「&」アンパサンドで連結して
変数「条件」に代入します。


18行目
【 MsgBox 条件
すべてのフィルターで抽出されている
列を繰り返し処理の中で参照して
値を代入した変数「条件」の値を
MsgBox関数で表示します。


※このコードでは
抽出条件が日付の場合や1つの列に2つ以上の抽出条件が設定されている場合は
抽出条件の取得ができません。


以上で
オートフィルターで抽出したデータの条件を取得する方法に
ついてに解説を終了します。
ありがとうございました。

スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク