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つ以上の抽出条件が設定されている場合は抽出条件の取得ができません。


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

スポンサーリンク

関連記事・広告