この記事では、シートに設定されているフィルターの設定状態を取得する方法についてご説明します。
【動画】シートに設定されているフィルターの設定状態を取得する実際の動き
本題に入る前に、まずは次の動画をご覧ください。
※撮影した動画が長くなってしまったため動画ファイルをYouTubeにアップロードできなかったので、動画が2つに分かれています。
指定した条件、その指定した条件の数、条件の種類などをマクロが取得してフィルターの設定状態を判定しています。
今回のサンプルでは、この取得した設定状態をメッセージボックスに出力しています。
マクロ作成の流れ
フィルターが設定されている場合は、STEP.2に進みます。
フィルターが設定されていない場合は、フィルターが設定されていないことを知らせるメッセージボックスを表示させて処理を終了します。
確認は1つの列に対して行います。もし5列にフィルターが設定されている場合は、5列分確認します。
フィルターに条件が設定されている場合はSTEP.3に進みます。
フィルターに条件が設定されていない場合は他の列に対し、再度このSTEP.2の処理を繰り返します。
Countプロパティの値が0の場合はSTEP.4、1ならSTEP.5、2ならSTEP.6、3以上ならSTEP.7の処理を行います。
Countプロパティは、フィルターにいくつ条件を指定しているのかをカウントするプロパティです。
Countプロパティの値が1なら条件が1つ、2なら条件が2つ、3以上なら3以上条件を指定していることになります。
ではCountプロパティの値が0の場合はどんな場合かというと、日付を条件に指定している場合です。
Operatorプロパティはフィルターに指定した1つの値や、トップテン、色やアイコンフィルターなどのフィルターの設定を表す値を返します。
このOperatorプロパティが返す値を判定してどのようなフィルターの設定が行われているかを特定します。
なお、STEP.5では条件が1つだけしか指定されていないので1つ目の条件だけを、このSTEP.6では条件が2つ指定されているので1つ目と2つ目の条件それぞれに対してSTEP.5と同じ内容を行います。
値はCriteria1プロパティから取得します。
Excelファイルの例
今回は次のExcelファイルを用意しました。
上記のExcelファイルには表があり、その表には日付、文字列、数値の列があります。
コードの例
Excelのマクロのコード(例)
Option Explicit Public Sub test() Dim settingInfo As String 'フィルターの設定状態を保存しておくための変数 Dim cnt As Long 'カウンタ用変数 Dim ws As Worksheet 'ワークシート用変数 Dim CBoard As DataObject 'クリップボード用変数 Dim vbsRge As Object '正規表現を使うためのRegExpオブジェクトのインスタンス用変数 Dim itemDic As Dictionary 'Dictionary用変数 Dim atFilters As Object 'AutoFilter.Filtersコレクション用変数 Dim fCount As Long 'フィルターが設定されている列の数をカウントするカウンタ変数 Dim fter As Filter 'フィルター用変数 Dim fterOnOffChkFlg As Boolean 'フィルターが設定されているか否かの判定用フラグ Dim colPos As Long '行位置用変数 Dim cellVal As Variant 'セルの情報 Dim dateAry() As Variant '日付用配列 Dim itemDicVal As Variant 'Dictionaryが持つ値 Dim myMatches1 As Object '正規表現のマッチ判定結果用変数(Criteria1用) Dim myMatches2 As Object '正規表現のマッチ判定結果用変数(Criteria2用) Dim dataStr1 As String '数値で表示された日付(Criteria1用) Dim dataStr2 As String '数値で表示された日付(Criteria2用) Dim rlOp1 As String '比較演算子用変数(Criteria1用) Dim rlOp2 As String '比較演算子用変数(Criteria2用) Dim crtr1 As Variant 'フィルターの1つ目の条件用変数 'フィルターの設定状態を知らせるメッセージの文言 settingInfo = "【フィルターの設定状態】" 'カウンタを初期化する cnt = 0 'シート名を取得する Set ws = Worksheets("work") 'クリップボードの処理を扱うためのインスタンスを生成する Set CBoard = New DataObject '正規表現を使うためのRegExpオブジェクトのインスタンスを生成する Set vbsRge = CreateObject("VBScript.RegExp") 'Dictionaryオブジェクトのインスタンスを生成する Set itemDic = New Dictionary If ws.AutoFilterMode Then 'フィルターが設定されている場合 'AutoFilter.Filtersコレクションを取得する Set atFilters = ws.AutoFilter.Filters '表示されているセルの行数を取得する fCount = WorksheetFunction.Subtotal(3, ws.Cells(atFilters.Parent.Range.Column, 1).CurrentRegion.Columns(1)) 'フィルターが設定されている列の数だけ処理を繰り返すFor文 For Each fter In atFilters If fter.On Then 'フィルターに条件が設定されている場合 'フィルターが設定されていることを知らせるフラグにTrueに設定する fterOnOffChkFlg = True '現在参照しているフィルターの列位置を取得する colPos = fter.Parent.Range.Offset(0, cnt).Column '(メッセージ表示用) '列位置と列名を取得する settingInfo = settingInfo & Chr(13) & _ "■" & Split(Sheets("work").Cells(1, colPos).Address, "$")(1) & "列:" & _ ws.Cells(1, colPos).Value 'フィルター設定されている条件の数を判定 Select Case fter.Count Case Is = 0 '日付がフィルターの条件に設定されている場合 'フィルターで表示されているセルの数だけループするFor文 For Each cellVal In ws.AutoFilter.Range.Columns(colPos).SpecialCells(xlCellTypeVisible) If ws.Cells(1, colPos).Value <> cellVal Then 'フィールド名とフィルターで表示されているセルの値が一致しない場合(フィールド名は取得したくないので) '動的配列の再宣言を行う(配列に格納されている値を残したまま) ReDim Preserve dateAry(cnt) 'セルに表示されている日付を配列に格納する dateAry(cnt) = ws.Cells(cellVal.Row, cellVal.Column) cnt = cnt + 1 End If Next cellVal '配列dateAryの数だけ処理を繰り返す(重複している日付を一意で整理する) For cnt = 0 To UBound(dateAry) - 1 If itemDic.Exists(dateAry(cnt)) = False Then 'Dictionaryのインスタンスに配列の値が存在していない場合 'Dictionaryのインスタンスに配列の値を追加する itemDic.Add dateAry(cnt), dateAry(cnt) End If Next cnt For Each itemDicVal In itemDic.Items 'フィルターの条件を取得する settingInfo = settingInfo & Chr(13) & _ "=" & itemDicVal Next itemDicVal Case Is = 1 'フィルターに設定されている条件が1つの場合 Select Case fter.Operator Case 0 'Operatorプロパティが0の場合 If IsDate(ws.Cells(2, colPos).Value) = True Then 'セルの値が日付の場合 '正規表現を使い、指定された条件の文字列とマッチングさせる With vbsRge '文字列全体を検索する .Global = True '正規表現で使用するパターンを設定する .Pattern = "(^<|^>)[^\*](\d*)[^\*]$" 'マッチングを実行する Set myMatches1 = .Execute(fter.Criteria1) End With If myMatches1.Count > 0 Then '1つ目の条件に指定した値がパターンにマッチングしている場合 '「>」「<」「=」の文字をreplace関数で削除する dataStr1 = Replace( _ Replace( _ Replace( _ fter.Criteria1, _ ">", "") _ , "<", "") _ , "=", "") '演算子を抜き出す rlOp1 = Replace(fter.Criteria1, dataStr1, "") '日付の値を日付型に変換して先頭に演算子を結合させる dataStr1 = rlOp1 & CDate(dataStr1) Else '1つ目の条件に指定した値がパターンにマッチングしていない場合 '1つ目の条件に指定した値をdataStr1に格納する dataStr1 = fter.Criteria1 End If '条件の内容をsettingInfoに格納する(日付の前に演算子を結合させておく) settingInfo = settingInfo & Chr(13) & _ dataStr1 Else 'セルの値が値の場合 settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 End If Case xlTop10Items 'Operatorプロパティが3(xlTop10Items(表示される最大値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "上位" & fCount - 1 & "項目" Case xlBottom10Items 'Operatorプロパティが4(xlBottom10Items(表示される最も小さい値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "下位" & fCount - 1 & "項目" Case xlTop10Percent 'Operatorプロパティが5(xlTop10Percent(表示される最大値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "上位のパーセントで設定" Case xlBottom10Percent 'Operatorプロパティが6(xlBottom10Percent(表示される最も小さい値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "下位のパーセントで設定" Case xlFilterCellColor 'Operatorプロパティが8(xlFilterCellColor(セルの色))の場合 'セルが「塗りつぶし」のフィルター設定が行われている色のコードを取得する settingInfo = settingInfo & Chr(13) & _ "セルの色のフィルター(コード):" & fter.Criteria1.Color Case xlFilterNoFill 'Operatorプロパティが12(xlFilterNoFill(セルの色(なし)))の場合 'セルが「塗りつぶしなし」のフィルター設定が行われていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "セルの「塗りつぶしなし」でフィルター設定" Case xlFilterFontColor 'Operatorプロパティが9(xlFilterFontColor(フォントの色))の場合 'フォントが「塗りつぶし」のフィルター設定が行われている色のコードを取得する settingInfo = settingInfo & Chr(13) & _ "フォントの色のフィルター(コード):" & fter.Criteria1 Case xlFilterAutomaticFontColor 'Operatorプロパティが13(xlFilterAutomaticFontColor(フォントの色(自動))の場合 'フォントの色のフィルターが「自動」で設定されていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "フォントの色のフィルターが「自動」に設定" Case xlFilterIcon 'Operatorプロパティが10(xlFilterIcon(アイコン))の場合 'アイコンが設定されていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "アイコンがフィルターに設定されている" Case xlFilterNoIcon 'Operatorプロパティが14(xlFilterNoIcon(アイコン(なし)))の場合 'アイコンが設定されていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "「アイコンなし」がフィルターに設定されている" Case xlFilterDynamic 'Operatorプロパティが11(動的フィルタ)の場合 Select Case fter.Criteria1 Case xlFilterToday '「今日」が設定されている場合 '→Criteria1プロパティが1(xlFilterToday(今日))の場合 '「今日」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今日" Case xlFilterYesterday '「昨日」が設定されている場合 '→Criteria1プロパティが2(xlFilterYesterday(昨日))の場合 '「昨日」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "昨日" Case xlFilterTomorrow '「明日」が設定されている場合 '→Criteria1プロパティが3(xlFilterTomorrow(明日))の場合 '「明日」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "明日" Case xlFilterThisWeek '「今週」が設定されている場合 '→Criteria1プロパティが4(xlFilterThisWeek(今週))の場合 '「今週」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今週" Case xlFilterLastWeek '「先週」が設定されている場合 '→Criteria1プロパティが5(xlFilterThisWeek(先週))の場合 '「先週」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "先週" Case xlFilterNextWeek '「来週」が設定されている場合 '→Criteria1プロパティが6(xlFilterNextWeek(来週))の場合 '「来週」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来週" Case xlFilterThisMonth '「今月」が設定されている場合 '→Criteria1プロパティが7(xlFilterThisMonth(今月))の場合 '「今月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今月" Case xlFilterLastMonth '「先月」が設定されている場合 '→Criteria1プロパティが8(xlFilterLastMonth(先月))の場合 '「先月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "先月" Case xlFilterNextMonth '「来月」が設定されている場合 '→Criteria1プロパティが9(xlFilterNextMonth(来月))の場合 '「来月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来月" Case xlFilterThisQuarter '「今四半期」が設定されている場合 '→Criteria1プロパティが10(xlFilterThisQuarter(今四半期))の場合 '「今四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今四半期" Case xlFilterLastQuarter '「今四半期」が設定されている場合 '→Criteria1プロパティが11(xlFilterLastQuarter(前四半期))の場合 '「前四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "前四半期" Case xlFilterNextQuarter '「来四半期」が設定されている場合 '→Criteria1プロパティが12(xlFilterNextQuarter(来四半期))の場合 '「来四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来四半期" Case xlFilterThisYear '「今年」が設定されている場合 '→Criteria1プロパティが13(xlFilterThisYear(今年))の場合 '「今年」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今年" Case xlFilterLastYear '「昨年」が設定されている場合 '→Criteria1プロパティが14(xlFilterLastYear(昨年))の場合 '「昨年」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "昨年" Case xlFilterNextYear '「来年」が設定されている場合 '→Criteria1プロパティが15(xlFilterNextYear(来年))の場合 '「来年」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来年" Case xlFilterYearToDate '「今年の初めから今日まで」が設定されている場合 '→Criteria1プロパティが16(xlFilterYearToDate(今年の初めから今日まで))の場合 '「今年の初めから今日まで」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今年の初めから今日まで" Case xlFilterAllDatesInPeriodQuarter1 '「第 1 四半期」が設定されている場合 '→Criteria1プロパティが17(xlFilterAllDatesInPeriodQuarter1(第 1 四半期))の場合 '「第 1 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 1 四半期" Case xlFilterAllDatesInPeriodQuarter2 '「第 2 四半期」が設定されている場合 '→Criteria1プロパティが18(xlFilterAllDatesInPeriodQuarter2(第 2 四半期))の場合 '「第 2 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 2 四半期" Case xlFilterAllDatesInPeriodQuarter3 '「第 3 四半期」が設定されている場合 '→Criteria1プロパティが19(xlFilterAllDatesInPeriodQuarter3(第 3 四半期))の場合 '「第 3 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 3 四半期" Case xlFilterAllDatesInPeriodQuarter4 '「第 4 四半期」が設定されている場合 '→Criteria1プロパティが20(xlFilterAllDatesInPeriodQuarter4(第 4 四半期))の場合 '「第 4 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 4 四半期" Case xlFilterAllDatesInPeriodJanuary '「1 月」が設定されている場合 '→Criteria1プロパティが21(xlFilterAllDatesInPeriodJanuary(1 月))の場合 '「1 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "1 月" Case xlFilterAllDatesInPeriodFebruray '「2 月」が設定されている場合 '→Criteria1プロパティが22(xlFilterAllDatesInPeriodFebruray(2 月))の場合 '「2 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "2 月" Case xlFilterAllDatesInPeriodMarch '「3 月」が設定されている場合 '→Criteria1プロパティが23(xlFilterAllDatesInPeriodMarch(3 月))の場合 '「3 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "3 月" Case xlFilterAllDatesInPeriodApril '「4 月」が設定されている場合 '→Criteria1プロパティが24(xlFilterAllDatesInPeriodApril(4 月))の場合 '「4 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "4 月" Case xlFilterAllDatesInPeriodMay '「5 月」が設定されている場合 '→Criteria1プロパティが25(xlFilterAllDatesInPeriodMay(5 月))の場合 '「5 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "5 月" Case xlFilterAllDatesInPeriodJune '「6 月」が設定されている場合 '→Criteria1プロパティが26(xlFilterAllDatesInPeriodJune(6 月))の場合 '「6 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "6 月" Case xlFilterAllDatesInPeriodJuly '「7 月」が設定されている場合 '→Criteria1プロパティが27(xlFilterAllDatesInPeriodJuly(7 月))の場合 '「7 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "7 月" Case xlFilterAllDatesInPeriodAugust '「8 月」が設定されている場合 '→Criteria1プロパティが28(xlFilterAllDatesInPeriodAugust(8 月))の場合 '「8 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "8 月" Case xlFilterAllDatesInPeriodSeptember '「9 月」が設定されている場合 '→Criteria1プロパティが29(xlFilterAllDatesInPeriodSeptember(9 月))の場合 '「9 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "9 月" Case xlFilterAllDatesInPeriodOctober '「10 月」が設定されている場合 '→Criteria1プロパティが30(xlFilterAllDatesInPeriodOctober(10 月))の場合 '「10 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "10 月" Case xlFilterAllDatesInPeriodNovember '「11 月」が設定されている場合 '→Criteria1プロパティが31(xlFilterAllDatesInPeriodNovember(11 月))の場合 '「11 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "11 月" Case xlFilterAllDatesInPeriodDecember '「12 月」が設定されている場合 '→Criteria1プロパティが32(xlFilterAllDatesInPeriodDecember(12 月))の場合 '「12 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "12 月" Case xlFilterAboveAverage 'フィルターの条件が「平均より上」の場合 '→Criteria1プロパティが33(xlFilterAboveAverage(平均を上回る値))の場合 '「平均より上」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "平均より上" Case xlFilterBelowAverage 'フィルターの条件が「平均より上」の場合 '→Criteria1プロパティが34(xlFilterBelowAverage(平均を下回る値))の場合 '「平均より下」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "平均より下" End Select End Select Case Is = 2 'フィルターに設定されている条件が2つの場合 If IsDate(ws.Cells(2, colPos).Value) = True Then 'セルの値が日付の場合 '正規表現を使い、指定された条件の文字列とマッチングさせる With vbsRge '文字列全体を検索する .Global = True '正規表現で使用するパターンを設定する .Pattern = "(^<|^>)[^\*](\d*)[^\*]$" 'マッチングを実行する(1つ目の条件に指定した値のマッチング) Set myMatches1 = .Execute(fter.Criteria1) 'マッチングを実行する(2つ目の条件に指定した値のマッチング) Set myMatches2 = .Execute(fter.Criteria2) End With If myMatches1.Count > 0 Then '1つ目の条件に指定した値がパターンにマッチングしている場合 '「>」「<」「=」「*」の文字をreplace関数で削除する dataStr1 = Replace( _ Replace( _ Replace( _ fter.Criteria1, _ ">", "") _ , "<", "") _ , "=", "") '演算子を抜き出す rlOp1 = Replace(fter.Criteria1, dataStr1, "") '日付の値を日付型に変換して先頭に演算子を結合させる dataStr1 = rlOp1 & CDate(dataStr1) Else '1つ目の条件に指定した値がパターンにマッチングしていない場合 '1つ目の条件に指定した値をdataStr1に格納する dataStr1 = fter.Criteria1 End If If myMatches2.Count > 0 Then '2つ目の条件に指定した値がパターンにマッチングしている場合 '「>」「<」「=」の文字をreplace関数で削除する dataStr2 = Replace( _ Replace( _ Replace( _ fter.Criteria2, _ ">", "") _ , "<", "") _ , "=", "") '演算子を抜き出す rlOp2 = Replace(fter.Criteria2, dataStr2, "") '日付の値を日付型に変換して先頭に演算子を結合させる dataStr2 = rlOp2 & CDate(dataStr2) Else '2つ目の条件に指定した値がパターンにマッチングしていない場合 '2つ目の条件に指定した値をdataStr2に格納する dataStr2 = fter.Criteria2 End If If fter.Operator = xlAnd Then 'カスタムオートフィルターで「AND」が選択されている場合 'AND条件の内容をsettingInfoに格納する(日付の前に演算子を結合させておく) settingInfo = settingInfo & Chr(13) & _ dataStr1 & _ " AND " & _ dataStr2 ElseIf fter.Operator = xlOr Then 'カスタムオートフィルターで「OR」が選択されている場合 'AND条件の内容をsettingInfoに格納する(日付の前に演算子を結合させておく) settingInfo = settingInfo & Chr(13) & _ dataStr1 & _ " OR " & _ dataStr2 End If Else 'セルの値が値の場合 If fter.Operator = xlAnd Then 'カスタムオートフィルターで「AND」が選択されている場合 'AND条件の内容をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 & _ " AND " & _ fter.Criteria2 ElseIf fter.Operator = xlOr Then 'カスタムオートフィルターで「OR」が選択されている場合 'AND条件の内容をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 & _ " OR " & _ fter.Criteria2 End If End If Case Is >= 3 'フィルターに設定されている条件が3つ以上の場合 For Each crtr1 In fter.Criteria1 'フィルターの条件を取得する settingInfo = settingInfo & Chr(13) & _ crtr1 Next crtr1 End Select End If cnt = cnt + 1 Next fter If fterOnOffChkFlg = True Then 'フィルターに条件が1つ以上設定されている場合 'フィルターの設定状態をメッセージボックスで表示する MsgBox settingInfo With CBoard .SetText settingInfo '変数のデータをDataObjectに格納する .PutInClipboard 'DataObjectのデータをクリップボードに格納する End With ElseIf fterOnOffChkFlg = False Then 'フィルターに条件が1つも設定されていない場合 MsgBox "フィルターの設定が1つもされていません。" End If Else 'フィルターが設定されていない場合 MsgBox "フィルターが設定されていません。" End If '後処理 Set atFilters = Nothing Set CBoard = Nothing Set vbsRge = Nothing Set myMatches1 = Nothing Set myMatches2 = Nothing Set itemDic = Nothing End Sub
注目すべきコード①
最初に見て頂きたいのは37行目から40行目です。
'クリップボードの処理を扱うためのインスタンスを生成する Set CBoard = New DataObject '正規表現を使うためのRegExpオブジェクトのインスタンスを生成する Set vbsRge = CreateObject("VBScript.RegExp")
以上のコードは、クリップボードの処理を扱うためのインスタンス生成と、正規表現を使うためのRegExpオブジェクトのインスタンス生成を行うコードです。
クリップボードの処理を扱うためのインスタンス生成は、シートに設定されているフィルターの設定状態を何かに貼り付けられようにするために必要で、正規表現を使うためのRegExpオブジェクトのインスタンスは正規表現を行うために必要です。
なぜクリップボードを使うのかというと、フィルターに条件をたくさん指定していると、メッセージボックスが画面からはみ出てしまうからです。
なので、フィルターに条件をたくさん指定している場合にクリップボードに保存しておけばメモ帳やExcelに貼りつけて確認することができるのでクリップボードのインスタンスを生成しておきます。
注目すべきコード②
次に見て頂きたいのは45行目です。
If ws.AutoFilterMode Then
以上のコードは、表にフィルターが設定されているかを判定するIF文のコードです。
AutoFilterModeプロパティがTrueの場合は表にフィルターが設定されている、Falseの場合は設定されていないことを表します。
注目すべきコード③
次に見て頂きたいのは50行目から53行目です。
'AutoFilter.Filtersコレクションを取得する Set atFilters = ws.AutoFilter.Filters '表示されているセルの行数を取得する fCount = WorksheetFunction.Subtotal(3, ws.Cells(atFilters.Parent.Range.Column, 1).CurrentRegion.Columns(1))
以上のコードは、AutoFilter.Filtersコレクションを取得し、フィルターが設定されているセルに対して表示されているセルの行数を取得するコードです。
AutoFilter.Filtersコレクションを取得すると、フィルターに関する様々な情報を取得することができます。
その情報の一つが53行目の「atFilters.Parent.Range.Column」で、このプロパティはフィルターの条件が設定されている列位置を返すプロパティです。
この列位置をワークシート関数のSubtotal関数の引数に指定することで、フィルターが設定されているセルに対して表示されているセルの行数を取得しています。
注目すべきコード④
次に見て頂きたいのは56行目です。
'フィルターが設定されている列の数だけ処理を繰り返すFor文 For Each fter In atFilters
以上のコードは、フィルターが設定されている列の数だけ処理を繰り返すFor文です。
もしフィルターが5列設定されている場合は、5列分フィルターの状態を確認します。
注目すべきコード⑤
次に見て頂きたいのは58行目です。
If fter.On Then
以上のコードは、フィルターに条件が設定されているかを判定するIF文のコードです。
OnプロパティがTrueの場合はフィルターに条件が設定されている、Falseの場合は設定されていないことを表します。
注目すべきコード⑥
次に見て頂きたいのは66行目です。
'現在参照しているフィルターの列位置を取得する colPos = fter.Parent.Range.Offset(0, cnt).Column
以上のコードは、現在フィルターの状態を確認している列位置を取得するコードです。
注目すべきコード⑦
次に見て頂きたいのは70行目から72行目です。
'(メッセージ表示用) '列位置と列名を取得する settingInfo = settingInfo & Chr(13) & _ "■" & Split(Sheets("work").Cells(1, colPos).Address, "$")(1) & "列:" & _ ws.Cells(1, colPos).Value
以上のコードは、列位置と列名を取得しているコードです。
71行目は列位置を、72行目では列名を取得しています。
この取得した列位置と列名を変数settingInfoに格納しています。
変数settingInfoは本マクロの処理の最後に、シートに設定されているフィルターの設定状態をメッセージボックスに表示するのに使います。
また、メッセージボックスに表示する情報が多いと画面からはみ出てしまうことも考えらるので、念のためクリップボードにも格納しています。
メッセージボックスには次の画面の通りに表示されます。
このコード以外でも、フィルターの設定情報を取得したら変数settingInfoにしておきます。
注目すべきコード⑧
次に見て頂きたいのは75行目です。
'フィルター設定されている条件の数を判定 Select Case fter.Count
以上のコードは、フィルター設定されている条件の数を判定しているコードです。
Countプロパティの値の種類は大きく4パターンあります。
- 0
- 1
- 2
- 3以上
Countプロパティが0
フィルターの条件に日付が設定されている場合Countプロパティが0を返します。
'フィルターで表示されているセルの数だけループするFor文 For Each cellVal In ws.AutoFilter.Range.Columns(colPos).SpecialCells(xlCellTypeVisible) If ws.Cells(1, colPos).Value <> cellVal Then 'フィールド名とフィルターで表示されているセルの値が一致しない場合(フィールド名は取得したくないので) '動的配列の再宣言を行う(配列に格納されている値を残したまま) ReDim Preserve dateAry(cnt) 'セルに表示されている日付を配列に格納する dateAry(cnt) = ws.Cells(cellVal.Row, cellVal.Column) cnt = cnt + 1 End If Next cellVal
82行目のコードは、フィルターが設定されている状態で表示されているセルを取得し、84行目では1行目のセルかどうかを判定しています。
なぜ1行目のセルかどうかを判定しているのかというと、1行目のセルはデータ部ではなく項目名のセルだからです。
フィルターを設定したときはデータ部だけが欲しいので、項目名のセルは除外するために78行目で判定を行っています。
89行目のコードでは、データ部のセルにある日付を格納するための配列dateAryを再宣言し、92行目でその配列dateAryに日付を格納しています。
ただし、同じ日付のセルがある場合は、重複した日付が配列に格納されてしまいます。
このままだと日付が重複された状態で確認結果に表示されてしまうので、101行目から112行目のコードで配列dateAryに格納された重複した日付を一意に整理します。
'配列dateAryの数だけ処理を繰り返す(重複している日付を一意で整理する) For cnt = 0 To UBound(dateAry) - 1 If itemDic.Exists(dateAry(cnt)) = False Then 'Dictionaryのインスタンスに配列の値が存在していない場合 'Dictionaryのインスタンスに配列の値を追加する itemDic.Add dateAry(cnt), dateAry(cnt) End If Next cnt
101行目のコードは、配列dateAryの要素数分処理を繰り返すFor文で、配列dateAryに格納された日付を一つ一つチェックしていきます。
103行目のコードで、Dictionaryのインスタンスに配列の日付が存在しているか判定し、存在していなければExistsメソッドはFalseを返すので108行目のAddメソッドが実行されます。
このAddメソッドはDictionaryのインスタンスに配列の日付を格納するメソッドです。
103行目の「Dictionaryのインスタンスに配列の日付が格納されていない」と、108行目の「(格納されていないから)Dictionaryのインスタンスに日付を格納する」を繰り返し行います。
この処理の繰り返しにより、重複した日付はDictionaryのインスタンスには格納されることがないため、日付を一意に整理することができます。
Dictionaryのインスタンスに日付全てが格納されたら、114行目から120行目で日付を変数settingInfoに格納していきます。
For Each itemDicVal In itemDic.Items 'フィルターの条件を取得する settingInfo = settingInfo & Chr(13) & _ "=" & itemDicVal Next itemDicVal
114行目のコードは、Dictionaryのインスタンスに格納された日付の数分処理を繰り返すForで、117行目と118行目で日付を変数settingInfoに格納していきます。
変数settingInfoの中身をメッセージボックスに出力すると下の画面の通りになります。
Countプロパティが1
(カスタムオートフィルターで)数値か文字(列)、日付を1つ指定した場合や、トップテン、色やアイコンフィルターなどのフィルターが設定されているときにCountプロパティが1を返します。
以上のフィルターの中でどの設定が行われているかを判定するには、Operatorプロパティが返す以下の値で判定することができます。
- 0(一覧で表示されている数値か文字(列)を1つだけ指定するか、(カスタムオートフィルターで)数値か文字(列)、日付のいずれか1つ指定した場合)
- 3(xlTop10Items(表示される最大値の項目))
- 4(xlBottom10Items(表示される最も小さい値の項目))
- 5(xlTop10Percent(表示される最大値の項目))
- 6(xlBottom10Percent(表示される最も小さい値の項目))
- 8(xlFilterCellColor(セルの色))
- 9(xlFilterNoFill(フォントの色))
- 10(xlFilterIcon(アイコン))
- 12(xlFilterNoFill(セルの色(なし)))
- 13(xlFilterAutomaticFontColor(フォントの色(自動))
- 14(xlFilterNoIcon(アイコン(なし)))
- 11(動的フィルタ)※さらにCriteria1プロパティの値を判定する
Operatorプロパティが0
Case 0 'Operatorプロパティが0の場合 If IsDate(ws.Cells(2, colPos).Value) = True Then 'セルの値が日付の場合 '正規表現を使い、指定された条件の文字列とマッチングさせる With vbsRge '文字列全体を検索する .Global = True '正規表現で使用するパターンを設定する .Pattern = "(^<|^>)[^\*](\d*)[^\*]$" 'マッチングを実行する(1つ目の条件に指定した値のマッチング) Set myMatches1 = .Execute(fter.Criteria1) End With If myMatches1.Count > 0 Then '1つ目の条件に指定した値がパターンにマッチングしている場合 '「>」「<」「=」の文字をreplace関数で削除する dataStr1 = Replace( _ Replace( _ Replace( _ fter.Criteria1, _ ">", "") _ , "<", "") _ , "=", "") '演算子を抜き出す rlOp1 = Replace(fter.Criteria1, dataStr1, "") '日付の値を日付型に変換して先頭に演算子を結合させる dataStr1 = rlOp1 & CDate(dataStr1) Else '1つ目の条件に指定した値がパターンにマッチングしていない場合 '1つ目の条件に指定した値をdataStr1に格納する dataStr1 = fter.Criteria1 End If '条件の内容をsettingInfoに格納する(日付の前に演算子を結合させておく) settingInfo = settingInfo & Chr(13) & _ dataStr1 Else 'セルの値が値の場合 If fter.Operator = xlAnd Then 'カスタムオートフィルターで「AND」が選択されている場合 'AND条件の内容をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 & _ " AND " & _ fter.Criteria2 ElseIf fter.Operator = xlOr Then 'カスタムオートフィルターで「OR」が選択されている場合 'AND条件の内容をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 & _ " OR " & _ fter.Criteria2 End If End If
以下のように数値か文字(列)を一覧から選択した状態でフィルターを設定した場合、または数値か文字(列)、日付のいずれか1つ指定した場合はOperatorプロパティが0の値を返します。
※日付は対象外です。(Countプロパティが0に該当するため)
注意
ここで注意が必要なのは日付を指定した場合です。
例えばカスタムオートフィルターで「2023/8/19」の日付を選んだ場合に、カスタムオートフィルターにある条件の種類で12項目あるうちの「と等しくない」「より後」「以降」「より前」「以前」のどれかを選んだ場合、「2023/8/19」のような「yyyy/mm/dd」形式ではなく「45157」のような数字の並び(シリアル値)でCriteria1プロパティが返してしまうんです。(Criteria1プロパティは選ばれた日付を返すプロパティ)
ここで一度、日付および各条件が指定された時のCriteria1プロパティがどのように値を返すのか整理します。(yyyy/mm/dd形式かシリアル値か)
- と等しい:=2023/8/19
- と等しくない:<>45157
- より後:>45157
- 以降:>=45157
- より前:<45157
- 以前:<=45157
- で始まる:=2023/8/19*
- で始まらない:<>2023/8/19*
- で終わる:=*2023/8/19
- で終わらない:<>*2023/8/19
- を含む:=*2023/8/19*
- を含まない:<>*2023/8/19*
①「と等しい」が選択された場合
②「と等しくない」が選択された場合
②「より後」が選択された場合
④「以降」が選択された場合
⑤「より前」が選択された場合
⑥「以前」が選択された場合
⑦「で始まる」が選択された場合
⑧「で始まらない」が選択された場合
⑨「で終わる」が選択された場合
⑩「で終わらない」が選択された場合
⑪「を含む」が選択された場合
⑫「を含まない」が選択された場合
Criteria1プロパティが日付をシリアル値で返す場合の対応
Criteria1プロパティが日付をシリアル値で返す場合は、今回のサンプルでは「yyyy/mm/dd」形式に変換するように対応します。
対応するのは良いのですが、まずはCriteria1プロパティが日付をシリアル値で返すかどうかを判定する必要があります。
ちなみに、Criteria1プロパティが日付をシリアル値で返す条件は以下の5つになります。
- と等しくない:<>45157
- より後:>45157
- 以降:>=45157
- より前:<45157
- 以前:<=45157
①「と等しくない」が選択された場合
②「より後」が選択された場合
③「以降」が選択された場合
④「より前」が選択された場合
⑤「以前」が選択された場合
Criteria1プロパティの返す値を見て頂くと分かると思いますが、値には不等号(=や<など)が付与されています。 不等号によってどんな条件(「と等しくない」や「より後」)が特定できます。 今回のサンプルでは正規表現を使い、Criteria1プロパティが返す値に使われている不等号を元に、どんな条件が使われているのかを判定します。 再度示しますが、シリアル値を返す条件は次の5つの条件の時です。
- と等しくない:<>45157
- より後:>45157
- 以降:>=45157
- より前:<45157
- 以前:<=45157
以上のシリアル値に付与されている不等号の組み合わせから、上記の5つの条件に全て合致する正規表現のパターンは「(^<|^>)[^\*](\d*)[^\*]$」です。(143行目)
マッチしているか判定したい値をExecuteメソッドの引数に指定して実行すると判定した内容がmyMatches1に格納されます。
'正規表現で使用するパターンを設定する .Pattern = "(^<|^>)[^\*](\d*)[^\*]$" 'マッチングを実行する(1つ目の条件に指定した値のマッチング) Set myMatches1 = .Execute(fter.Criteria1)
もしパターンに合致するとシリアル値であることが特定できるので150行目のIF文に合致します。
If myMatches1.Count > 0 Then
もしシリアル値ならこのシリアル値を「yyyy/mm/dd形式」に変換するために、まずは不等号をReplace関数を使って取り除きます。(155行目から161行目)
'「>」「<」「=」の文字をreplace関数で削除する dataStr1 = Replace( _ Replace( _ Replace( _ fter.Criteria1, _ ">", "") _ , "<", "") _ , "=", "")
次に取り除いた不等号を、シリアル値を「yyyy/mm/dd形式」に変換した後に再び不等号を元に戻すため一旦変数rlOp1に退避させておきます。(164行目)
'演算子を抜き出す rlOp1 = Replace(fter.Criteria1, dataStr1, "")
次にシリアル値をCDate関数を使って「yyyy/mm/dd形式」に変換し、先ほど退避させて演算子を結合させれば完了です。(167行目)
'日付の値を日付型に変換して先頭に演算子を結合させる dataStr1 = rlOp1 & CDate(dataStr1)
シリアル値を「yyyy/mm/dd形式」に変換した結果は次の通りです。
「と等しくない」を選んだ場合でも「yyyy/mm/dd形式」で日付が表示されています。
また、条件が「と等しい」を選んだ時はCriteria1プロパティが返す値が「yyyy/mm/dd形式」で日付を返すので、その日付をそのまま取得します。
Else '1つ目の条件に指定した値がパターンにマッチングしていない場合 '1つ目の条件に指定した値をdataStr1に格納する dataStr1 = fter.Criteria1
Operatorプロパティが3(xlTop10Items(表示される最大値の項目))の場合
Case xlTop10Items 'Operatorプロパティが3(xlTop10Items(表示される最大値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "上位" & fCount - 1 & "項目"
数値の列に対して「数値フィルター」→「トップテン」を選択し、「トップテンオートフィルター」ダイアログで「上位」「数値」「項目」の3つを選択した場合はOperatorプロパティが3の値を返します。
Operatorプロパティが4(xlBottom10Items(表示される最も小さい値の項目))
Case xlBottom10Items 'Operatorプロパティが4(xlBottom10Items(表示される最も小さい値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "下位" & fCount - 1 & "項目"
数値の列に対して「数値フィルター」→「トップテン」を選択し、「トップテンオートフィルター」ダイアログで「下位」「数値」「項目」の3つを選択した場合はOperatorプロパティが4の値を返します。
OperatorプロパティがOperatorプロパティが5(xlTop10Percent(表示される最大値の項目))
Case xlTop10Percent 'Operatorプロパティが5(xlTop10Percent(表示される最大値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "上位のパーセントで設定"
数値の列に対して「数値フィルター」→「トップテン」を選択し、「トップテンオートフィルター」ダイアログで「上位」「数値」「パーセント」の3つを選択した場合はOperatorプロパティが5の値を返します。
正しくは「上位○○パーセント」と結果出力したかったのですが、パーセントの値が取得できず課題として残ってしまっています。
Operatorプロパティが6(xlBottom10Percent(表示される最も小さい値の項目))
Case xlBottom10Percent 'Operatorプロパティが6(xlBottom10Percent(表示される最も小さい値の項目))の場合 '条件に指定した値をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "下位のパーセントで設定"
数値の列に対して「数値フィルター」→「トップテン」を選択し、「トップテンオートフィルター」ダイアログで「下位」「数値」「パーセント」の3つを選択した場合はOperatorプロパティが6の値を返します。
正しくは「下位○○パーセント」と結果出力したかったのですが、パーセントの値が取得できず課題として残ってしまっています。
Operatorプロパティが8(xlFilterCellColor(セルの色))
Case xlFilterCellColor 'Operatorプロパティが8(xlFilterCellColor(セルの色))の場合 'セルが「塗りつぶし」のフィルター設定が行われている色のコードを取得する settingInfo = settingInfo & Chr(13) & _ "セルの色のフィルター(コード):" & fter.Criteria1.Color
色が設定されているセルが存在する列に対して「色フィルター」→何らかの色を設定した場合はOperatorプロパティが8の値を返します。
Operatorプロパティが9(xlFilterFontColor(フォントの色))
Case xlFilterFontColor 'Operatorプロパティが9(xlFilterFontColor(フォントの色))の場合 'フォントが「塗りつぶし」のフィルター設定が行われている色のコードを取得する settingInfo = settingInfo & Chr(13) & _ "フォントの色のフィルター(コード):" & fter.Criteria1
フォントの色が設定されているセルが存在する列に対して「色フィルター」→何らかの色を設定した場合はOperatorプロパティが9の値を返します。
Operatorプロパティが10(xlFilterIcon(アイコン))
Case xlFilterIcon 'Operatorプロパティが10(xlFilterIcon(アイコン))の場合 'アイコンが設定されていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "アイコンがフィルターに設定されている"
アイコンが設定されているセルが存在する列に対して「色フィルター」→何らかのアイコンを設定した場合はOperatorプロパティが10の値を返します。
正しくは「〇〇のアイコンが設定されている」と結果出力したかったのですが、正確なアイコンの名称が取得できず課題として残ってしまっています。
Operatorプロパティが12(xlFilterNoFill(セルの色(なし)))
Case xlFilterNoFill 'Operatorプロパティが12(xlFilterNoFill(セルの色(なし)))の場合 'セルが「塗りつぶしなし」のフィルター設定が行われていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "セルの「塗りつぶしなし」でフィルター設定"
色が設定されているセルが存在する列に対して「色フィルター」→「塗りつぶしなし」を設定した場合はOperatorプロパティが12の値を返します。
Operatorプロパティが13(xlFilterAutomaticFontColor(フォントの色(自動))
Case xlFilterAutomaticFontColor 'Operatorプロパティが13(xlFilterAutomaticFontColor(フォントの色(自動))の場合 'フォントの色のフィルターが「自動」で設定されていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "フォントの色のフィルターが「自動」に設定"
色が設定されているセルが存在する列に対して「色フィルター」→「自動」を設定した場合はOperatorプロパティが13の値を返します。
Operatorプロパティが14(xlFilterNoIcon(アイコン(なし)))
Case xlFilterNoIcon 'Operatorプロパティが14(xlFilterNoIcon(アイコン(なし)))の場合 'アイコンが設定されていることを知らせるメッセージを設定する settingInfo = settingInfo & Chr(13) & _ "「アイコンなし」がフィルターに設定されている"
色が設定されているセルが存在する列に対して「色フィルター」→「アイコンなし」を設定した場合はOperatorプロパティが14の値を返します。
Operatorプロパティが11(動的フィルタ)の場合
Case xlFilterDynamic 'Operatorプロパティが11(動的フィルタ)の場合
日付フィルターで何かを選択した場合、または数値フィルターで「平均より上」「平均より下」を選択した場合は、Operatorプロパティが11の値を返します。
日付フfィルターに関しては色々な種類の項目が存在しており、選択した項目によってCriteria1プロパティの値が返されます。
- 1(xlFilterToday(今日))
- 2(xlFilterYesterday(昨日)
- 3(xlFilterTomorrow(明日))
- 4(xlFilterThisWeek(今週))
- 5(xlFilterLastWeek(先週))
- 6(xlFilterNextWeek(来週))
- 7(xlFilterThisMonth(今月))
- 8(xlFilterLastMonth(先月))
- 9(xlFilterNextMonth(来月))
- 10(xlFilterThisQuarter(今四半期))
- 11(xlFilterLastQuarter(前四半期))
- 12(xlFilterNextQuarter(来四半期))
- 13(xlFilterThisYear(今年))
- 14(xlFilterLastYear(昨年))
- 15(xlFilterNextYear(来年))
- 16(xlFilterYearToDate(今年の初めから今日まで))
- 17(xlFilterAllDatesInPeriodQuarter1(第1四半期))
- 18(xlFilterAllDatesInPeriodQuarter2(第2四半期))
- 19(xlFilterAllDatesInPeriodQuarter3(第3四半期))
- 20(xlFilterAllDatesInPeriodQuarter4(第4四半期))
- 21(xlFilterAllDatesInPeriodJanuary(1月))
- 22(xlFilterAllDatesInPeriodFebruray(2月))
- 23(xlFilterAllDatesInPeriodMarch(3月))
- 24(xlFilterAllDatesInPeriodApril(4月))
- 25(xlFilterAllDatesInPeriodMay(5月))
- 26(xlFilterAllDatesInPeriodJune(6月))
- 27(xlFilterAllDatesInPeriodJuly(7月))
- 28(xlFilterAllDatesInPeriodAugust(8月))
- 29(xlFilterAllDatesInPeriodSeptember(9月))
- 30(xlFilterAllDatesInPeriodOctober(10月))
- 31(xlFilterAllDatesInPeriodNovember(11月))
- 32(xlFilterAllDatesInPeriodDecember(12月))
- 33(xlFilterAboveAverage(平均より上))
- 34(xlFilterBelowAverage(平均より下))
Criteria1プロパティが1(今日)の場合
Case xlFilterToday '「今日」が設定されている場合 '→Criteria1プロパティが1(xlFilterToday(今日))の場合 '「今日」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今日"
日付フィルターで「今日」を選択した場合は、Criteria1プロパティが1の値を返します。
Criteria1プロパティが2(昨日)の場合
Case xlFilterYesterday '「昨日」が設定されている場合 '→Criteria1プロパティが2(xlFilterYesterday(昨日))の場合 '「昨日」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "昨日"
日付フィルターで「昨日」を選択した場合は、Criteria1プロパティが2の値を返します。
Criteria1プロパティが3(明日)の場合
Case xlFilterTomorrow '「明日」が設定されている場合 '→Criteria1プロパティが3(xlFilterTomorrow(明日))の場合 '「明日」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "明日"
日付フィルターで「明日」を選択した場合は、Criteria1プロパティが3の値を返します。
Criteria1プロパティが4(今週)の場合
Case xlFilterThisWeek '「今週」が設定されている場合 '→Criteria1プロパティが4(xlFilterThisWeek(今週))の場合 '「今週」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今週"
日付フィルターで「今週」を選択した場合は、Criteria1プロパティが4の値を返します。
Criteria1プロパティが5(先週)の場合
Case xlFilterLastWeek '「先週」が設定されている場合 '→Criteria1プロパティが5(xlFilterThisWeek(先週))の場合 '「先週」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "先週"
日付フィルターで「先週」を選択した場合は、Criteria1プロパティが5の値を返します。
Criteria1プロパティが6(来週)の場合
Case xlFilterNextWeek '「来週」が設定されている場合 '→Criteria1プロパティが6(xlFilterNextWeek(来週))の場合 '「来週」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来週"
日付フィルターで「来週」を選択した場合は、Criteria1プロパティが6の値を返します。
Criteria1プロパティが7(今月)の場合
Case xlFilterThisMonth '「今月」が設定されている場合 '→Criteria1プロパティが7(xlFilterThisMonth(今月))の場合 '「今月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今月"
日付フィルターで「今月」を選択した場合は、Criteria1プロパティが7の値を返します。
Criteria1プロパティが8(先月)の場合
Case xlFilterLastMonth '「先月」が設定されている場合 '→Criteria1プロパティが8(xlFilterLastMonth(先月))の場合 '「先月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "先月"
日付フィルターで「先月」を選択した場合は、Criteria1プロパティが8の値を返します。
Criteria1プロパティが9(来月)の場合
Case xlFilterNextMonth '「来月」が設定されている場合 '→Criteria1プロパティが9(xlFilterNextMonth(来月))の場合 '「来月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来月"
日付フィルターで「来月」を選択した場合は、Criteria1プロパティが9の値を返します。
Criteria1プロパティが10(来月)の場合
Case xlFilterThisQuarter '「今四半期」が設定されている場合 '→Criteria1プロパティが10(xlFilterThisQuarter(今四半期))の場合 '「今四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今四半期"
日付フィルターで「今四半期」を選択した場合は、Criteria1プロパティが10の値を返します。
Criteria1プロパティが11(前四半期)の場合
Case xlFilterLastQuarter '「今四半期」が設定されている場合 '→Criteria1プロパティが11(xlFilterLastQuarter(前四半期))の場合 '「前四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "前四半期"
日付フィルターで「前四半期」を選択した場合は、Criteria1プロパティが11の値を返します。
Criteria1プロパティが12(前四半期)の場合
Case xlFilterNextQuarter '「来四半期」が設定されている場合 '→Criteria1プロパティが12(xlFilterNextQuarter(来四半期))の場合 '「来四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来四半期"
日付フィルターで「来四半期」を選択した場合は、Criteria1プロパティが12の値を返します。
Criteria1プロパティが13(前四半期)の場合
Case xlFilterThisYear '「今年」が設定されている場合 '→Criteria1プロパティが13(xlFilterThisYear(今年))の場合 '「今年」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今年"
日付フィルターで「今年」を選択した場合は、Criteria1プロパティが13の値を返します。
Criteria1プロパティが14(昨年)の場合
Case xlFilterLastYear '「昨年」が設定されている場合 '→Criteria1プロパティが14(xlFilterLastYear(昨年))の場合 '「昨年」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "昨年"
日付フィルターで「昨年」を選択した場合は、Criteria1プロパティが14の値を返します。
Criteria1プロパティが15(来年)の場合
Case xlFilterNextYear '「来年」が設定されている場合 '→Criteria1プロパティが15(xlFilterNextYear(来年))の場合 '「来年」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "来年"
日付フィルターで「来年」を選択した場合は、Criteria1プロパティが15の値を返します。
Criteria1プロパティが16(今年の初めから今日まで)の場合
Case xlFilterYearToDate '「今年の初めから今日まで」が設定されている場合 '→Criteria1プロパティが16(xlFilterYearToDate(今年の初めから今日まで))の場合 '「今年の初めから今日まで」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "今年の初めから今日まで"
日付フィルターで「今年の初めから今日まで」を選択した場合は、Criteria1プロパティが16の値を返します。
Criteria1プロパティが17(第1四半期)の場合
Case xlFilterAllDatesInPeriodQuarter1 '「第 1 四半期」が設定されている場合 '→Criteria1プロパティが17(xlFilterAllDatesInPeriodQuarter1(第 1 四半期))の場合 '「第 1 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 1 四半期"
日付フィルターで「期間内の全日付」→「第 1 四半期」を選択した場合は、Criteria1プロパティが17の値を返します。
Criteria1プロパティが18(第2四半期)の場合
Case xlFilterAllDatesInPeriodQuarter2 '「第 2 四半期」が設定されている場合 '→Criteria1プロパティが18(xlFilterAllDatesInPeriodQuarter2(第 2 四半期))の場合 '「第 2 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 2 四半期"
日付フィルターで「期間内の全日付」→「第 2 四半期」を選択した場合は、Criteria1プロパティが18の値を返します。
Criteria1プロパティが19(第3四半期)の場合
Case xlFilterAllDatesInPeriodQuarter3 '「第 3 四半期」が設定されている場合 '→Criteria1プロパティが19(xlFilterAllDatesInPeriodQuarter3(第 3 四半期))の場合 '「第 3 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 3 四半期"
日付フィルターで「期間内の全日付」→「第 3 四半期」を選択した場合は、Criteria1プロパティが19の値を返します。
Criteria1プロパティが20(第4四半期)の場合
Case xlFilterAllDatesInPeriodQuarter4 '「第 4 四半期」が設定されている場合 '→Criteria1プロパティが20(xlFilterAllDatesInPeriodQuarter4(第 4 四半期))の場合 '「第 4 四半期」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "第 4 四半期"
日付フィルターで「期間内の全日付」→「第 4 四半期」を選択した場合は、Criteria1プロパティが20の値を返します。
Criteria1プロパティが21(1月)の場合
Case xlFilterAllDatesInPeriodJanuary '「1 月」が設定されている場合 '→Criteria1プロパティが21(xlFilterAllDatesInPeriodJanuary(1 月))の場合 '「1 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "1 月"
日付フィルターで「期間内の全日付」→「1月」を選択した場合は、Criteria1プロパティが21の値を返します。
Criteria1プロパティが22(2月)の場合
Case xlFilterAllDatesInPeriodFebruray '「2 月」が設定されている場合 '→Criteria1プロパティが22(xlFilterAllDatesInPeriodFebruray(2 月))の場合 '「2 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "2 月"
日付フィルターで「期間内の全日付」→「2月」を選択した場合は、Criteria1プロパティが22の値を返します。
Criteria1プロパティが23(3月)の場合
Case xlFilterAllDatesInPeriodMarch '「3 月」が設定されている場合 '→Criteria1プロパティが23(xlFilterAllDatesInPeriodMarch(3 月))の場合 '「3 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "3 月"
日付フィルターで「期間内の全日付」→「3月」を選択した場合は、Criteria1プロパティが23の値を返します。
Criteria1プロパティが24(4月)の場合
Case xlFilterAllDatesInPeriodApril '「4 月」が設定されている場合 '→Criteria1プロパティが24(xlFilterAllDatesInPeriodApril(4 月))の場合 '「4 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "4 月"
日付フィルターで「期間内の全日付」→「4月」を選択した場合は、Criteria1プロパティが24の値を返します。
Criteria1プロパティが25(5月)の場合
Case xlFilterAllDatesInPeriodMay '「5 月」が設定されている場合 '→Criteria1プロパティが25(xlFilterAllDatesInPeriodMay(5 月))の場合 '「5 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "5 月"
日付フィルターで「期間内の全日付」→「5月」を選択した場合は、Criteria1プロパティが25の値を返します。
Criteria1プロパティが26(6月)の場合
Case xlFilterAllDatesInPeriodJune '「6 月」が設定されている場合 '→Criteria1プロパティが26(xlFilterAllDatesInPeriodJune(6 月))の場合 '「6 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "6 月"
日付フィルターで「期間内の全日付」→「6月」を選択した場合は、Criteria1プロパティが26の値を返します。
Criteria1プロパティが27(7月)の場合
Case xlFilterAllDatesInPeriodJuly '「7 月」が設定されている場合 '→Criteria1プロパティが27(xlFilterAllDatesInPeriodJuly(7 月))の場合 '「7 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "7 月"
日付フィルターで「期間内の全日付」→「7月」を選択した場合は、Criteria1プロパティが27の値を返します。
Criteria1プロパティが28(8月)の場合
Case xlFilterAllDatesInPeriodAugust '「8 月」が設定されている場合 '→Criteria1プロパティが28(xlFilterAllDatesInPeriodAugust(8 月))の場合 '「8 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "8 月"
日付フィルターで「期間内の全日付」→「8月」を選択した場合は、Criteria1プロパティが28の値を返します。
Criteria1プロパティが29(9月)の場合
Case xlFilterAllDatesInPeriodSeptember '「9 月」が設定されている場合 '→Criteria1プロパティが29(xlFilterAllDatesInPeriodSeptember(9 月))の場合 '「9 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "9 月"
日付フィルターで「期間内の全日付」→「9月」を選択した場合は、Criteria1プロパティが29の値を返します。
Criteria1プロパティが30(10月)の場合
Case xlFilterAllDatesInPeriodOctober '「10 月」が設定されている場合 '→Criteria1プロパティが30(xlFilterAllDatesInPeriodOctober(10 月))の場合 '「10 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "10 月"
日付フィルターで「期間内の全日付」→「10月」を選択した場合は、Criteria1プロパティが30の値を返します。
Criteria1プロパティが31(11月)の場合
Case xlFilterAllDatesInPeriodNovember '「11 月」が設定されている場合 '→Criteria1プロパティが31(xlFilterAllDatesInPeriodNovember(11 月))の場合 '「11 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "11 月"
日付フィルターで「期間内の全日付」→「11月」を選択した場合は、Criteria1プロパティが31の値を返します。
Criteria1プロパティが32(12月)の場合
Case xlFilterAllDatesInPeriodDecember '「12 月」が設定されている場合 '→Criteria1プロパティが32(xlFilterAllDatesInPeriodDecember(12 月))の場合 '「12 月」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "12 月"
日付フィルターで「期間内の全日付」→「12月」を選択した場合は、Criteria1プロパティが32の値を返します。
Criteria1プロパティが33(平均より上)の場合
Case xlFilterAboveAverage 'フィルターの条件が「平均より上」の場合 '→Criteria1プロパティが33(xlFilterAboveAverage(平均を上回る値))の場合 '「平均より上」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "平均より上"
数値フィルターで「平均より上」を選択した場合は、Criteria1プロパティが33の値を返します。
Criteria1プロパティが34(平均より下)の場合
Case xlFilterBelowAverage 'フィルターの条件が「平均より上」の場合 '→Criteria1プロパティが34(xlFilterBelowAverage(平均を下回る値))の場合 '「平均より下」の文言をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ "平均より下"
数値フィルターで「平均より下」を選択した場合は、Criteria1プロパティが34の値を返します。
Countプロパティが2
(カスタムオートフィルターで)数値か文字(列)、日付のどれか2つ指定した場合、Countプロパティが2を返します。
ただし、ここで注意が必要なのは日付を指定した場合です。
日付を指定した場合条件によっては日付を返すCriteria1プロパティとCriteria2プロパティが「yyyy/mm/dd形式」ではなくシリアル値を返してしまいます。(詳細はこちらで説明しています)
シリアル値では日付が分からないので、このシリアル値を「yyyy/mm/dd形式」に変換します。変換についてはこちらの説明の中で方法を記述しているのでご参照ください。
シリアル値を「yyyy/mm/dd形式」に変換したら次は「カスタムオートフィルター」ダイアログの「AND」か「OR」かを判定します。
「AND」か「OR」はOperatorプロパティの値が1(xlAnd)か2(xlOr)かで判定することができます。
668行目のOperatorプロパティの判定で「AND」の場合(xlAnd)は674行目から677行目で1つ目の条件と「AND」の文字、そして2つ目の条件を結合させて変数settingInfoに、「OR」の場合(xlOr)は684行目から687行目で1つ目の条件と「OR」の文字、そして2つ目の条件を結合させて変数settingInfoに格納しています。
If fter.Operator = xlAnd Then 'カスタムオートフィルターで「AND」が選択されている場合 'AND条件の内容をsettingInfoに格納する(日付の前に演算子を結合させておく) settingInfo = settingInfo & Chr(13) & _ dataStr1 & _ " AND " & _ dataStr2 ElseIf fter.Operator = xlOr Then 'カスタムオートフィルターで「OR」が選択されている場合 'AND条件の内容をsettingInfoに格納する(日付の前に演算子を結合させておく) settingInfo = settingInfo & Chr(13) & _ dataStr1 & _ " OR " & _ dataStr2 End If
この変数settingInfoをメッセージボックスに表示させた画面は下の通りです。
数値か文字(列)の場合はそのままの値が使えるので、以下のコードが実行されます。
Else 'セルの値が値の場合 If fter.Operator = xlAnd Then 'カスタムオートフィルターで「AND」が選択されている場合 'AND条件の内容をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 & _ " AND " & _ fter.Criteria2 ElseIf fter.Operator = xlOr Then 'カスタムオートフィルターで「OR」が選択されている場合 'AND条件の内容をsettingInfoに格納する settingInfo = settingInfo & Chr(13) & _ fter.Criteria1 & _ " OR " & _ fter.Criteria2 End If
695行目のOperatorプロパティの判定で「AND」の場合(xlAnd)は700行目から703行目で1つ目の条件と「AND」の文字、そして2つ目の条件を結合させて変数settingInfoに、「OR」の場合(xlOr)は710行目から713行目で1つ目の条件と「OR」の文字、そして2つ目の条件を結合させて変数settingInfoに格納しています。
この変数settingInfoをメッセージボックスに表示させた画面は下の通りです。
Countプロパティが3以上
フィルターの条件に数値か文字(列)が3つ以上設定されている場合Countプロパティが3を返します。
※日付はCountプロパティが0に該当するため対象外です。
指定された数値か文字(列)は、Criteria1プロパティが返します。
Criteria1プロパティが返す値の数だけ723行目のFor文内で繰り返し行い、726行目と727行目で取得したCriteria1プロパティの値(指定された数値か文字(列))をsettingInfoに格納します。
Case Is >= 3 'フィルターに設定されている条件が3つ以上の場合 For Each crtr1 In fter.Criteria1 'フィルターの条件を取得する settingInfo = settingInfo & Chr(13) & _ crtr1 Next crtr1
この変数settingInfoをメッセージボックスに表示させた画面は下の通りです。
注目すべきコード⑨
次に見て頂きたいのは739行目から759行目です。
If fterOnOffChkFlg = True Then 'フィルターに条件が1つ以上設定されている場合 'フィルターの設定状態をメッセージボックスで表示する MsgBox settingInfo With CBoard .SetText settingInfo '変数のデータをDataObjectに格納する .PutInClipboard 'DataObjectのデータをクリップボードに格納する End With ElseIf fterOnOffChkFlg = False Then 'フィルターに条件が1つも設定されていない場合 MsgBox "フィルターの設定が1つもされていません。" End If
以上のコードは、フィルターに条件が設定されているかを判定し、されていればフィルターの設定状態をメッセージボックスとクリップボードに保存する処理のコードです。
fterOnOffChkFlgはフィルターに条件が設定されているかを確認するためのフラグ変数で、フィルターに条件が設定されたタイミングでTrueが設定されているので、fterOnOffChkFlgがTrueかどうかをまず判定しています。(759行目)
ちなみにfterOnOffChkFlgがTrueに設定されるのは57行目で行っています。
フィルターに条件が設定されている場合はOnプロパティがTrueを返すので(52行目)、その場合はfterOnOffChkFlgがTrueに設定されます。(57行目)
If fter.On Then 'フィルターに条件が設定されている場合 'フィルターが設定されていることを知らせるフラグにTrueに設定する fterOnOffChkFlg = True
744行目では、フィルターに設定された条件が格納されたsettingInfoの値をメッセージボックスに出力する処理です。
ただし、フィルターに設定された条件が多すぎると注目すべきコード①で説明しているようにメッセージボックスに表示しきれない場合があるため、746行目から751行目のクリップボードにsettingInfoの値を格納する処理も行っています。
クリップボードに格納しておけば、メモ帳やExcelに貼り付けて確認することができます。
fterOnOffChkFlgがFalseの場合(753行目)はフィルターに何も条件が設定されていない状態なので、757行目で「フィルターの設定が1つもされていません。」とメッセージを表示するだけで他に処理は行いません。
注目すべきコード⑩
次に見て頂きたいのは761行目から767行目です。
Else 'フィルターが設定されていない場合 MsgBox "フィルターが設定されていません。" End If
以上のコードは、フィルターが設定されていない場合に、フィルターが設定されていないことを知らせる処理のコードです。
761行目のElseは、以下のコードの45行目のws.AutoFilterModeプロパティがTrueに合致しないときに当てはまる条件のことを指します。
If ws.AutoFilterMode Then
ws.AutoFilterModeは、フィルターが設定されているときにはTrueを返し、設定されていない場合はFalseを返します。
761行目のElseはフィルターが設定されていない場合なので、765行目で「フィルターが設定されていません。」とメッセージを表示させます。
動作確認
今回は以下のExcelファイルを使います。
数値や文字列、日付の列があり、セルと文字に色が付いていて、アイコンが設定されているセルがあります。
ケース1:フィルターが設定されていない場合
「フィルターが設定されていません。」とメッセージが表示されました。
ケース2:フィルターが設定されていない場合
「フィルターの設定が1つもされていません。」とメッセージが表示されました。
ケース3:数値を一覧から1つ選択した場合
フィルターの条件に指定した数値が1つ表示されました。
ケース4:数値を一覧から2つ選択した場合
フィルターの条件に指定した数値が2つ表示されました。
ケース5:数値を一覧から3つ選択した場合
フィルターの条件に指定した数値が3つ表示されました。
ケース6:カスタムオートフィルターで「と等しい」を選択して数値を指定した場合
カスタムオートフィルターで指定した数値に「=」が付与された状態で条件が表示されました。
ケース7:カスタムオートフィルターで「を含まない」を選択して数値を指定した場合
カスタムオートフィルターで指定した数値の先頭に「<>*」と、末尾に「*」が付与された状態で条件が表示されました。
ケース8:カスタムオートフィルターで「と等しい」「を含まない」「AND」を選択して数値を指定した場合
カスタムオートフィルターで1つ目に指定した数値の先頭に「=」が付与された状態で条件が、さらに「AND」と、カスタムオートフィルターで指定した数値の先頭に「<>*」と、末尾に「*」が付与された状態で条件が表示されました。
ケース9:カスタムオートフィルターで「と等しい」「を含まない」「OR」を選択して数値を指定した場合
カスタムオートフィルターで1つ目に指定した数値の先頭に「=」が付与された状態で条件が、さらに「OR」と、カスタムオートフィルターで指定した数値の先頭に「<>*」と、末尾に「*」が付与された状態で条件が表示されました。
ケース10:トップテン で「上位」「10」「項目」を指定した場合
上位10項目と表示されました。
ケース11:「平均より上」を指定した場合
平均より上と表示されました。
ケース12:日付を一覧から1つ選択した場合
フィルターの条件に指定した日付が1つ表示されました。
ケース13:日付を一覧から2つ選択した場合
フィルターの条件に指定した日付が2つ表示されました。
ケース14:日付を一覧から3つ選択した場合
フィルターの条件に指定した日付が3つ表示されました。
ケース15:カスタムオートフィルターで「と等しい」を選択して日付を指定した場合
カスタムオートフィルターで指定した日付に「=」が付与された状態で条件が表示されました。
ケース16:カスタムオートフィルターで「を含まない」を選択して日付を指定した場合
カスタムオートフィルターで指定した日付の先頭に「<>*」と、末尾に「*」が付与された状態で条件が表示されました。
ケース17:カスタムオートフィルターで「と等しい」「を含まない」「AND」を選択して日付を指定した場合
カスタムオートフィルターで1つ目に指定した日付の先頭に「=」が付与された状態で条件が、さらに「AND」と、カスタムオートフィルターで指定した日付の先頭に「<>*」と、末尾に「*」が付与された状態で条件が表示されました。
ケース18:カスタムオートフィルターで「と等しい」「を含まない」「OR」を選択して日付を指定した場合
カスタムオートフィルターで1つ目に指定した日付の先頭に「=」が付与された状態で条件が、さらに「OR」と、カスタムオートフィルターで指定した日付の先頭に「<>*」と、末尾に「*」が付与された状態で条件が表示されました。
ケース19:日付フィルターで「明日」を選択した場合
明日と表示されました。
ケース20:日付フィルターで「今四半期」を選択した場合
今四半期と表示されました。
ケース21:日付フィルターで「今年の初めから今日まで」を選択した場合
今年の初めから今日までと表示されました。
ケース22:日付フィルターで「第3四半期」を選択した場合
第3四半期と表示されました。
ケース23:日付フィルターで「2月」を選択した場合
2月と表示されました。
ケース24:黄色のセルでフィルターを設定した場合
黄色のコードが表示されました。
ケース25:「塗りつぶしなし」でフィルターを設定した場合
セルの「塗りつぶしなし」でフィルター設定と表示されました。
ケース26:赤色のフォントでフィルターを設定した場合
赤色のコードが表示されました。
ケース27:「自動」でフォントのフィルターを設定した場合
フォントの色のフィルターが「自動」に設定と表示されました。
ケース28:アイコンでフィルターを設定した場合
アイコンがフィルターに設定されていると表示されました。
ケース29:「アイコンなし」でフィルターを設定した場合
「アイコンなし」がフィルターに設定されていると表示されました。
ケース30:複数の列でフィルターを設定した場合
フィルターを設定した状態を確認することができました。
ケース31:すべての列でフィルターを設定した場合
全ての列のフィルターの設定状態を確認することができました。
【注意】参照設定が必要です
一つ注意点があるのですが、先ほどのコードを動かすには参照設定が必要です。
参照設定の一覧(下の画像を参考)から次の項目(ライブラリ)にチェックを付けて「OK」ボタンをクリックします。
- Microsoft Scripting Runtime(scrrun.dll)
なぜ必要かというと、10行目の「Dictionary」というオブジェクトが「scrrun.dll」というファイルを参照するからです。
Dim itemDic As Dictionary 'Dictionary用変数
この参照設定をしないと下の画像のエラーが出ますので必ず行う必要があります。
ここでは「scrrun.dll」とは何者かについては記事の本題から逸れてしまうので詳細は割愛しますが、マクロで「Dictionary」というオブジェクトを使う場合は参照設定しないと動かない、程度に思って頂ければと思います。
最後に
本記事では、シートに設定されているフィルターの設定状態を取得する方法についてご説明しました。
シートに設定されているフィルターの設定状態はいちいちフィルターをクリックしないとどんなフィルターの設定が行われているか分からないので少々面倒です。
フィルターが設定されている列が多くある場合はなおさら確認するのが面倒です。
そこで今回のサンプルではどこの列にどのようなフィルターの設定が行われているかをメッセージボックスに表示させることで一目で確認できるようにしてあります。
また、もしフィルターの設定条件がたくさんある場合にメッセージボックスが画面からはみ出てしまうかもしれないので、念のためフィルターの設定条件をクリップボードに保存するよう対応してあります。
メモ帳やExcelファイルにクリップボードの情報を貼り付けることができるので、そちらもお試しいただけると幸いです。
お手軽にシートに設定されているフィルターの設定状態を確認したい場合は本記事を参考にしてみてくださいね。
Excelのスキル向上やExcelの基礎知識をしっかりと学びたいなら
Excelのスキルを習得したい、Excelの基礎知識をもっと理解したい、そう考えているなら「無期限サポート付きExcel講座【すごい改善】」がおすすめです。
Excelのスキルの基礎を身につけるなら【すごい改善】で無期限サポート付きがあるので、これで「Excelのスキルや基礎」を学ぶのにおすすめですよ。