Excel VBA オートフィルタで日付を条件に絞り込み(AutoFilterメソッド)

オートフィルタ操作

今回はAutoFilterメソッドで日付で絞り込む方法をご説明します。

AutoFilterメソッドでオートフィルタを使用するという事は、次にする事は絞り込みかと思います。

AutoFilterメソッド の基本的な使用方法や構文、引数一覧、文字列操作などは次の記事をご覧ください。

1.日付で絞り込む際の注意事項

まず一番最初に日付で絞り込む際に、理解しておくことがあります。

日付を「等しい」と指定する際には「セルに入力されている日付(シリアル値)」で絞り込むのではなく、「見えている日付の表示形式」で絞り込む必要があります。

絞り込む範囲の表示形式を予め把握している場合には問題ないですが、そうではない場合には日付の表示形式を取得して指定する必要があります。

具体的に言いますと、セルに「2019/1/1」と入力されていても、表示形式が「2019/01/01」であれば「2019/01/01」と絞り込み指定しなければいけないということです。

ただし、以上「>=」、以下「<=」などの「等しい」以外は入力された日付と認識出来れば大丈夫です。

2.日付を指定して絞り込む

上記の注意事項を踏まえたうえで、日付の絞り込み方法です。

日付で絞り込む場合は「=」、「<」、「>」と等しい、以上、以下、大きい、小さいといった不等号を使用して絞り込みをすることが多いです。

注意するすべきは「=」の時くらいで、使い分け自体はそれほど難しくないと思いますが、それぞれ簡単なサンプルでご説明します。

データには次のようなサンプルデータを使用します。

D列が「2018/2/1」と等しいデータを絞り込みします。

指定した日付と等しい「=」で絞り込む

まずは、指定した日付と等しいという条件で絞り込みます。

「等しい」絞り込みが一番難しいです。

予め表示形式がわかっている場合

予め表示形式がわかっている場合は、Format関数で表示形式を指定する事で絞り込み出来ます。

次のコードではあえて「2018/02/01」という文字列をFormat関数で「yyyy/m/d」で表示形式を書き換えています。

日付を指定する場合にセルを参照する場合等でも同じです。

Sub Sample1()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:=Format("2018/02/01", "yyyy/m/d")

End Sub

セルに入力された日付を参照したサンプルコードです。

Sub Sample2()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:=Format(Cells(1, 7), "yyyy/m/d")

End Sub
日付の表示形式がわからない場合

データによっては表示形式がわからない場合もあるかと思います。

そんなときの指定すべき表示形式を取得して指定します。

もちろん表示形式がわかっていても、次のように記述しておくことで指定する日付の形式が間違っていても対応出来ます。

表示形式を取得するには「NumberFormatLocalプロパティ」で取得可能です。

次のサンプルコードはA2の日付の表示形式をFormat関数の形式に指定しています。

Sub Sample3()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:=Format(Cells(1, 7), Cells(2, 1).NumberFormatLocal)

End Sub

以上、以下で絞り込む

以上、以下で絞り込む場合は「>=」、「<=」となります。※「=」の位置は右です。

上記で説明した通り、「等しい」以外は日付は入力された「2018/02/01」でも正常に絞り込めます。

注意点はRange(Cells)で指定する場合には、「“>=” & Range」の様に「”>=”」を文字列として記述します。

以上で絞り込み
Sub Sample4()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:=">=" & Cells(1, 7)

End Sub
以下で絞り込み
Sub Sample5()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:="<=" & Cells(1, 7)

End Sub

指定した日付より大きい、小さいで絞り込む

大きい「>」、小さい「<」で指定する事ができ、こちらも入力されている日付認識出来れば指定できます。

こちらも注意点はRange(Cells)で指定する場合には、「“>” & Range」の様に「”>”」を文字列として記述します。

より大きい絞り込み
Sub Sample6()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:=">" & Cells(1, 7)

End Sub
より小さい絞り込み
Sub Sample7()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, Criteria1:="<" & Cells(1, 7)

End Sub

3.日付の範囲を指定して絞り込む

1つの条件ではなく○○~○○の期間というような、範囲を指定する条件は次のように記述します。

次のコードは「2018/2/1以上~2018/3/31以下」と絞り込みしています。

ポイントは「Operator:=xlAnd」でAndを使用しているところです。

Sub Sample8()

Dim MaxRow  As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, _
            Criteria1:=">=" & Cells(1, 7), _
            Operator:=xlAnd, _
            Criteria2:="<=" & Cells(1, 9)

End Sub

4.特定の期間、日付の絞り込み

日付を絞り込む際に、「今日」、「今月」、「○年」、「○月」、「○日」等特定の指定で絞り込むことができます。

特定の期間、日付で絞り込む場合は次のように記述します。

Range.AutoFilter 1, 定数, xlFilterDynamic

絞り込みたい定数を「Criteria1」に指定して、「Operator」に「xlFilterDynamic」を指定します。

正直なところすべてを覚えて使うという機会も少ないと思いますが、一覧です。

定数説明
xlFilterToday1今日
xlFilterYesterday2昨日
xlFilterTomorrow3明日
xlFilterThisWeek4今週
xlFilterLastWeek5先週
xlFilterNextWeek6来週
xlFilterThisMonth7今月
xlFilterLastMonth8先月
xlFilterNextMonth9来月
xlFilterThisQuarter10今四半期
xlFilterLastQuarter11前四半期
xlFilterNextQuarter12来四半期
xlFilterThisYear13今年
xlFilterLastYear14昨年
xlFilterNextYear15来年
xlFilterYearToDate16今年の初めから今日まで
xlFilterAllDatesInPeriodQuarter117期間内の全日付:第1四半期
xlFilterAllDatesInPeriodQuarter218期間内の全日付:第2四半期
xlFilterAllDatesInPeriodQuarter319期間内の全日付:第3四半期
xlFilterAllDatesInPeriodQuarter420期間内の全日付:第4四半期
xlFilterAllDatesInPeriodJanuary21期間内の全日付:1月
xlFilterAllDatesInPeriodFebruray22期間内の全日付:2月
xlFilterAllDatesInPeriodMarch23期間内の全日付:3月
xlFilterAllDatesInPeriodApril24期間内の全日付:4月
xlFilterAllDatesInPeriodMay25期間内の全日付:5月
xlFilterAllDatesInPeriodJune26期間内の全日付:6月
xlFilterAllDatesInPeriodJuly27期間内の全日付:7月
xlFilterAllDatesInPeriodAugust28期間内の全日付:8月
xlFilterAllDatesInPeriodSeptember29期間内の全日付:9月
xlFilterAllDatesInPeriodOctober30期間内の全日付:10月
xlFilterAllDatesInPeriodNovember31期間内の全日付:11月
xlFilterAllDatesInPeriodDecember32期間内の全日付:12月

次のコードはサンプルデータの「2月」で絞り込みます。

Sub Sumple9()

Range("A1").AutoFilter 1, xlFilterAllDatesInPeriodFebruray, xlFilterDynamic

End Sub

5.条件指定が3つ以上の場合

日付ももちろん3つ以上の条件で指定することができます。

3つ以上で指定する場合は、文字列や数値と違い「Criteria1」ではなく、「Criteria2」に条件を指定します。

「Criteria1」は使いませんので、引数を省略する事になり引数名を省略できません。

ですが、配列を使用するところは文字列や数値と同じです。

次のサンプルコードは日付を「2018/1/1、2018/2/1、2018/3/1」の3つで絞り込みます。

Sub Sumple10()

Dim MaxRow          As Long

MaxRow = Cells(Rows.Count, 1).End(xlUp).Row

Range(Cells(1, 1), Cells(MaxRow, 4)) _
            .AutoFilter Field:=1, _
            Operator:=xlFilterValues, _
            Criteria2:=Array(2, "2018/1/1", 2, "2018/2/1", 2, "2018/3/1")

End Sub

最後の配列の「Array(2, “2018/1/1”, 2, “2018/2/1”, 2, “2018/3/1”)」の「2」が気になるところです。

これは指定した日付の「何」を指定するかを指定しています。

数字の意味は次の通りです。

数字意味
0後ろに指定した日付の
1後ろに指定した日付の
2後ろに指定した日付の
3後ろに指定した時刻の
4後ろに指定した時刻の
5後ろに指定した時刻の
タイトルとURLをコピーしました