Categories: VBA

VBA│オートフィルタで日付を絞り込む。特定日以前や特定期間の条件設定

この記事では、Excelのオートフィルタを使った日付の絞り込みについて、実際のVBAコードも含めて説明します。

Excelのオートフィルタは、使用頻度の高い機能となり、必然的にVBAへの実装が有用なケースも多くありますが、文字列や数値とは異なり、日付の絞り込みは少し難易度が高いです。

説明するための情報量も多くなりますので、当記事はVBAを使ったオートフィルタで日付を扱う場合に特化しています。

オートフィルタの基本的な使い方については、下記の記事で説明していますので、必要に応じてご参考ください。

VBAの日付のオートフィルタ設定は、「Excel2003/2007」とそれ以降(2010/2013/365/2021)で扱いが異なります。当記事では、「Excel2003/2007」については、10年以上前のバージョンであることと、検証が困難であることを理由に説明を割愛します。

VBA│オートフィルタで日付を絞り込む

Excelシートの書式設定について

VBAのオートフィルタで、日付の絞り込みの難易度が高い理由として、「日付」のデータの書式設定が多いことがあげられます。

例えば、Excelで「〇月〇日」形式で書式が設定されていると、VBAのコードで「yyyy/MM/dd」で Criteria1 を記述しても絞り込みはされません。

〇月〇日の書式設定がされている

年月日を含めた正確な日付オートフィルタで絞り込みをするためには、Excelの日付の書式設定を「2020/1/1」の形式にしておくほうがよいでしょう。



この形式がよい

日付の絞り込み(yyyy/MM/dd)

Sub Sample()

Range(“A1″).AutoFilter Field:=6, Criteria1:=”2020/7/1”


End Sub

Criteria1:=の設定を「2020/07/01」のようにゼロ埋めをすると絞り込みに失敗します

日付の絞り込み(〇月〇日)

この章の頭で説明したように、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

オートフィルタで定数「xlFilter」を使う

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月
xlFilterAllDatesInPeriodFebruray2月
xlFilterAllDatesInPeriodMarch3月
xlFilterAllDatesInPeriodApril4月
xlFilterAllDatesInPeriodMay5月
xlFilterAllDatesInPeriodJune 6月
xlFilterAllDatesInPeriodJuly7月
xlFilterAllDatesInPeriodAugust8月
xlFilterAllDatesInPeriodSeptember9月
xlFilterAllDatesInPeriodOctober10月
xlFilterAllDatesInPeriodNovember11月
xlFilterAllDatesInPeriodDecember12月

2月について。スペルが誤っていますが、VBAの定数自体が誤っています。
※VBAでコードを書く場合は、上表のスペルとなります。

Webs

元事務処理担当者として、プログラミングを活用した業務改善を推進している。プログラマ出身ではない事務職の現場目線で情報を発信。 その他、webs-studio.jpをメインに、複数のブログサイトを立ち上げており、合計で月間10万PVのメディア運営を行っている。 姉妹サイト一覧