今回は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」を指定します。
正直なところすべてを覚えて使うという機会も少ないと思いますが、一覧です。
定数 | 値 | 説明 |
xlFilterToday | 1 | 今日 |
xlFilterYesterday | 2 | 昨日 |
xlFilterTomorrow | 3 | 明日 |
xlFilterThisWeek | 4 | 今週 |
xlFilterLastWeek | 5 | 先週 |
xlFilterNextWeek | 6 | 来週 |
xlFilterThisMonth | 7 | 今月 |
xlFilterLastMonth | 8 | 先月 |
xlFilterNextMonth | 9 | 来月 |
xlFilterThisQuarter | 10 | 今四半期 |
xlFilterLastQuarter | 11 | 前四半期 |
xlFilterNextQuarter | 12 | 来四半期 |
xlFilterThisYear | 13 | 今年 |
xlFilterLastYear | 14 | 昨年 |
xlFilterNextYear | 15 | 来年 |
xlFilterYearToDate | 16 | 今年の初めから今日まで |
xlFilterAllDatesInPeriodQuarter1 | 17 | 期間内の全日付:第1四半期 |
xlFilterAllDatesInPeriodQuarter2 | 18 | 期間内の全日付:第2四半期 |
xlFilterAllDatesInPeriodQuarter3 | 19 | 期間内の全日付:第3四半期 |
xlFilterAllDatesInPeriodQuarter4 | 20 | 期間内の全日付:第4四半期 |
xlFilterAllDatesInPeriodJanuary | 21 | 期間内の全日付:1月 |
xlFilterAllDatesInPeriodFebruray | 22 | 期間内の全日付:2月 |
xlFilterAllDatesInPeriodMarch | 23 | 期間内の全日付:3月 |
xlFilterAllDatesInPeriodApril | 24 | 期間内の全日付:4月 |
xlFilterAllDatesInPeriodMay | 25 | 期間内の全日付:5月 |
xlFilterAllDatesInPeriodJune | 26 | 期間内の全日付:6月 |
xlFilterAllDatesInPeriodJuly | 27 | 期間内の全日付:7月 |
xlFilterAllDatesInPeriodAugust | 28 | 期間内の全日付:8月 |
xlFilterAllDatesInPeriodSeptember | 29 | 期間内の全日付:9月 |
xlFilterAllDatesInPeriodOctober | 30 | 期間内の全日付:10月 |
xlFilterAllDatesInPeriodNovember | 31 | 期間内の全日付:11月 |
xlFilterAllDatesInPeriodDecember | 32 | 期間内の全日付: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 | 後ろに指定した時刻の秒 |