この記事では、Excelのオートフィルタを使った日付の絞り込みについて、実際のVBAコードも含めて説明します。
Excelのオートフィルタは、使用頻度の高い機能となり、必然的にVBAへの実装が有用なケースも多くありますが、文字列や数値とは異なり、日付の絞り込みは少し難易度が高いです。
説明するための情報量も多くなりますので、当記事はVBAを使ったオートフィルタで日付を扱う場合に特化しています。
オートフィルタの基本的な使い方については、下記の記事で説明していますので、必要に応じてご参考ください。
VBAのオートフィルタで、日付の絞り込みの難易度が高い理由として、「日付」のデータの書式設定が多いことがあげられます。
例えば、Excelで「〇月〇日」形式で書式が設定されていると、VBAのコードで「yyyy/MM/dd」で Criteria1 を記述しても絞り込みはされません。
年月日を含めた正確な日付をオートフィルタで絞り込みをするためには、Excelの日付の書式設定を「2020/1/1」の形式にしておくほうがよいでしょう。
Sub Sample()
Range(“A1″).AutoFilter Field:=6, Criteria1:=”2020/7/1”
End Sub
この章の頭で説明したように、VBAのオートフィルタで日付を絞り込む場合には、Excelの書式設定を「yyyy/MM/dd」にすることが望ましいのですが、「〇月〇日」の書式設定でも、下記のように Criteria1:= を設定することで、絞り込むことができます。
Sub Sample()
Range(“A1″).AutoFilter Field:=6, Criteria1:=”7月1日”
End Sub
例えば、Excel側が「2020年7月1日」の書式設定になっている場合には、VBAコードでも Criteria1:= “2020年7月1日”と記述することで、絞り込むことができます。
「2020/7/1以降の日付レコードをオートフィルタで絞り込む」といった場合には、比較演算子を使うことで特定日以降のレコードを絞り込むことができます。
Sub Sample()
Range(“A1″).AutoFilter field:=6, Criteria1:=”>=2020/7/1″
End Sub
上記のコードで、2020/7/1以降の日付レコードを絞り込むことができます。
「2020/7/1以降かつ2021/6/30以前の日付レコードをオートフィルタで絞り込む」といった場合には、比較演算子と引数Operatorを使うことで特定期間のレコードを絞り込むことができます。
Sub Sample()
Range(“A1″).AutoFilter field:=6, Criteria1:=”>=2020/7/1″, _
Operator:=xlAnd, Criteria2:=”<=2021/6/30″
End Sub
「今日以降の日付レコードをオートフィルタで絞り込む」といった場合には、比較演算子と引数Operator、「今日の日付」の変数を使うことで絞り込むことができます。
※当記事の執筆日は、2022/1/24です
Sub Sample()
Dim d As Date
d = Format(Date, “yyyy/m/d”)
Range(“A1″).AutoFilter field:=6, Criteria1:=”>=” & d
End Sub
Excelのオートフィルタでは、日付の「年」「月」「日」、それぞれをキーにして絞り込みをしたり、「今週」「今月」「今年」のように、所定の期間で絞り込むことができます。
この章では、同様の機能をVBAで実行するためのVBAコードを紹介します。
例えば、「2021年(すべての月)」と「2022年1月」をオートフィルタで絞り込む場合のVBAコードは下記の通りです。
Sub Sample()
Range(“A1”).AutoFilter Field:=6, Operator:=xlFilterValues, _
Criteria2:=Array(0, “2021/01/01”, 1, “2022/1/1”)
End Sub
<1行目>
Range(“A1”) Range(“A1”).AutoFilter Field:=6, Operator:=xlFilterValues, _
引数Operatorには、定数「xlFilterValues」を指定します。
<2行目>
Criteria2:=Array(0, “2021/01/01”, 1, “2022/1/1”)
Criteria2:=には、配列関数「Array」を使用します。
Criteria2:=Array(0, “2021/01/01”, 1, “2022/1/1”)
Array内の1つ目の条件「0, “2021/01/01″」は、『2021年全体』を指定するコードです。頭の0が「年」を意味しています。※詳細は枠外
Criteria2:=Array(0, “2021/01/01”, 1, “2022/1/1”)
Array内の1つ目の条件「1, “2022/01/01″」は、『2022年1月』を指定するコードです。頭の1が「年月」を意味しています。 ※詳細は枠外
この節で紹介した例のように、オートフィルタで「年」や「月」を指定して絞り込む場合、日付の前に設定する数値は0~5で指定します。それぞれの数値の意味は下記の通りです。
0 | 日付の「年」 |
1 | 日付の「月」 |
2 | 日付の「日」 |
3 | 時刻の「時」 |
4 | 時刻の「分」 |
5 | 時刻の「秒」 |
Criteria2:=Array(0, “2021/01/01”, 1, “2022/1/1”)
の場合、「2021年」と「2022年1月」となります。
例えば、「昨年」をオートフィルタで絞り込む場合のVBAコードは下記の通りです。
※当記事の執筆日は、2022/1/24です
Sub Sample()
Range(“A1”).AutoFilter Field:=6, Operator:=xlFilterDynamic, _
Criteria1:=xlFilterLastYear
End Sub
<1行目>
Range(“A1”).AutoFilter Field:=6, Operator:=xlFilterDynamic, _
引数Operatorには、定数「xlFilterDynamic」を指定します。
<2行目>
Criteria1:=xlFilterLastYear
Criteria1:=には、昨年を意味する定数「xlFilterLastYear」を指定します。
xlFilterToday | 今日 |
xlFilterYesterday | 昨日 |
xlFilterTomorrow | 明日 |
xlFilterThisWeek | 今週 |
xlFilterLastWeek | 先週 |
xlFilterNextWeek | 来週 |
xlFilterThisMonth | 今月 |
xlFilterLastMonth | 先月 |
xlFilterNextMonth | 来月 |
xlFilterThisQuarter | 今四半期 |
xlFilterLastQuarter | 前四半期 |
xlFilterNextQuarter | 来四半期 |
xlFilterThisYear | 今年 |
xlFilterLastYear | 昨年 |
xlFilterNextYear | 来年 |
xlFilterYearToDate | 今年の初めから今日まで |
xlFilterAllDatesInPeriodQuarter1 | 第1四半期 |
xlFilterAllDatesInPeriodQuarter2 | 第2四半期 |
xlFilterAllDatesInPeriodQuarter3 | 第3四半期 |
xlFilterAllDatesInPeriodQuarter4 | 第4四半期 |
xlFilterAllDatesInPeriodJanuary | 1月 |
xlFilterAllDatesInPeriodFebruray | 2月 |
xlFilterAllDatesInPeriodMarch | 3月 |
xlFilterAllDatesInPeriodApril | 4月 |
xlFilterAllDatesInPeriodMay | 5月 |
xlFilterAllDatesInPeriodJune | 6月 |
xlFilterAllDatesInPeriodJuly | 7月 |
xlFilterAllDatesInPeriodAugust | 8月 |
xlFilterAllDatesInPeriodSeptember | 9月 |
xlFilterAllDatesInPeriodOctober | 10月 |
xlFilterAllDatesInPeriodNovember | 11月 |
xlFilterAllDatesInPeriodDecember | 12月 |