大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAを使って、オートフィルタで日付をフィルタする方法について、ご紹介します。日付フィルタがありますけど、日付をフィルタする場合も、「比較演算子」や「論理演算子」を組み合わせてフィルタすると、簡単です。

はじめに

この記事では、VBAを使ってオートフィルタで日付をフィルタする方法について、ご紹介しました。

日付をフィルタする場合は、「比較演算子」と「論理演算子」を組み合わせて、フィルタするとうまくフィルタすることができます。

日付フィルタもありますけど、フィルタしたい日付を作成して「比較演算子」や「論理演算子」を使ってフィルタした方が簡単です。

では、VBAを使ってオートフィルタで日付をフィルタする方法について、解説していきます。

この記事で紹介すること

  • VBAを使ってオートフィルタで日付をフィルタする方法

目次から見たい項目へ移動すると便利ですよ。

目次

VBAコードまとめ

オートフィルタで日付をフィルタするVBAコードについて、まとめています。

VBAコードだけ確認したい場合に、ご活用ください。

Range("A1").AutoFilter 1, "2021/8/1" '日付をフィルタ
Range("A1").AutoFilter 1, ">2021/12/1" '指定した日付「より大きい」
Range("A1").AutoFilter 1, ">=2021/12/1" '指定した日付「以上」
Range("A1").AutoFilter 1, "<2021/8/1" '指定した日付「より小さい」
Range("A1").AutoFilter 1, "<=2021/8/1" '指定した日付「以下」
Range("A1").AutoFilter 1, ">=2021/7/1", xlAnd, "<=2022/1/1" '指定した「期間」
Range("A1").AutoFilter 1, "<2021/7/1", xlOr, ">2022/1/1" '指定した期間を「含まない」
Range("A1").AutoFilter 1, Array("2021/5/1", "2021/8/1", "2021/12/1"), xlFilterValues '複数の日付

では、解説していきます。

オートフィルタで日付のフィルタをする

オートフィルタで日付のフィルタをしてみます。

指定した日付でフィルタ

日指定した日付「"2021/8/1"」でフィルタしてみます。

Sub TEST1()
    
    '日付をフィルタ
    Range("A1").AutoFilter 1, "2021/8/1"
    
End Sub

元データを用意しておきます。

元データ

元データ

VBAコードを実行してみます。

「"2021/8/1"」でフィルタ

「2021/8/1」でフィルタ

「"2021/8/1"」でフィルタできました。簡単です。

ピンポイントでフィルタする際の注意点がありますので、解説していきます。

日付でフィルターする際の注意

日付でフィルターする際の注意は、1文字でも表示が違うとフィルタされないということです。

オートフィルタでは、表示された文字でフィルタするためです。

1文字でも違うとフィルタできない

例えば、「"2021/8/1"」を「"2021/08/01"」でフィルタしてみます。

Sub TEST2()
    
    '日付をフィルタ
    Range("A1").AutoFilter 1, "2021/08/01" '←これではフィルタできない
    
End Sub

実行してみます。

1文字でも違うとフィルタできない

こんな感じでフィルタができません。

セルに入力した日付でそのままではフィルタできない

同じ考えでセルに入力した日付で、フィルタする場合も注意が必要です。

Sub TEST3()
    
    'セルの値を使ってフィルタ
    Range("A1").AutoFilter 1, Range("D1") '←これではフィルタできない
    
End Sub

セルに日付を入力します。

セルに日付を入力

セルに入力された日付でフィルタしてみます。

セルに入力した日付でそのままではフィルタできない

フィルタができていませんね。

セルの値を取得した際に、VBAでは、「"2021/08/01"」となるためです。

セルの値は「2021/08/01」となるので表示形式が違う

表の値は「"2021/8/1"」で、セルから取得した値は「"2021/08/01"」となって、表示形式が違うため、フィルタできません。

表示形式を指定して日付をフィルタする

ピンポイントでフィルタする場合は、表示形式を指定して日付をフィルタします。

Sub TEST4()
    
    '表示形式を指定して日付をフィルタ
    Range("A1").AutoFilter 1, Format(Range("D1"), "yyyy/m/d")
    
End Sub

実行してみます。

表示形式を指定すると日付がフィルタできる

表示形式を指定すると日付がフィルタできました。

「NumberFormatLocal」が便利

表示形式を取得する際には、「NumberFormatLocal」を使うと便利です。

Sub TEST5()
    
    '表示形式を指定して日付をフィルタ
    Range("A1").AutoFilter 1, Format(Range("D1"), Range("D1").NumberFormatLocal)
    
End Sub

実行してみます。

「NumberFormatLocal」で表示形式をセルから取得すると便利

正しくフィルタできました。

こんな感じで、ピンポイントでフィルタする場合は、「一字一句同じ文字」にする必要があります。

ちなみに、「比較演算子」を使った場合は、表示形式まで等しくする必要はありません。

「ワイルドカード」は使えない

日付のフィルタをする際に、「ワイルドカード」は使えません。

「"2021/8/*"」でフィルタしてみます。

Sub TEST6()
    
    'ワイルドカードは使えない
    Range("A1").AutoFilter 1, "2021/8/*"
    
End Sub

実行してみます。

「ワイルドカード」は使えない

「ワイルドカード」は使えないです。

日付のフィルタをする際は、ワイルドカードではなく、「比較演算子」や「論理演算子」を組み合わせて、期間のフィルタや複数の日付のフィルタをします。

期間でフィルタ

日付を期間でフィルタしてみます。

使える比較演算子は、次のものがあります。

  • 「">値"」 :値より大きい
  • 「"<値"」 :値より小さい
  • 「">=値"」:値以上
  • 「"<=値"」:値以下
  • 「"<>値"」:値以外
  • 「""」  :空白
  • 「"<>"」 :空白以外

論理演算子は、次の通りです。

  • 「xlAnd」:ANDの意味
  • 「xlOr」:ORの意味

という感じです。

では、それぞれフィルタしてみます。

「"2021/12/1"」より大きい日付でフィルタ

「">2021/12/1"」でフィルタします。

Sub TEST7()
    
    '指定した日付「より大きい」
    Range("A1").AutoFilter 1, ">2021/12/1"
    
End Sub

実行してみます。

「2021/12/1」より大きい日付でフィルタ

「"2021/12/1"」より大きい日付でフィルタできました。

「"2021/12/1"」以上で日付でフィルタ

「">=2021/12/1"」でフィルタします。

Sub TEST8()
    
    '指定した日付「以上」
    Range("A1").AutoFilter 1, ">=2021/12/1"
    
End Sub

実行してみます。

「2021/12/1」以上で日付でフィルタ

「"2021/12/1"」以上で日付でフィルタできました。

「"2021/8/1"」より小さい日付でフィルタ

「"<2021/8/1"」でフィルタします。

Sub TEST9()
    
    '指定した日付「より小さい」
    Range("A1").AutoFilter 1, "<2021/8/1"
    
End Sub

実行します。

「2021/8/1」より小さい日付でフィルタ

「"2021/8/1"」より小さい日付でフィルタできました。

「"2021/8/1"」以下で日付でフィルタ

「"<=2021/8/1"」でフィルタします。

Sub TEST10()
    
    '指定した日付「以下」
    Range("A1").AutoFilter 1, "<=2021/8/1"
    
End Sub

実行してみます。

「2021/8/1」以下で日付でフィルタ

「"2021/8/1"」以下で日付でフィルタできました。

「"2021/7/1"」~「"2022/1/1"」でフィルタ

「">=2021/7/1", xlAnd, "<=2022/1/1"」でフィルタします。

Sub TEST11()
    
    '指定した「期間」
    Range("A1").AutoFilter 1, ">=2021/7/1", xlAnd, "<=2022/1/1"
    
End Sub

実行してみます。

「2021/7/1」~「2022/1/1」でフィルタ

「"2021/7/1"」~「"2022/1/1"」でフィルタできました。

「"2021/7/1"」~「"2022/1/1"」を含まない

「"<2021/7/1", xlOr, ">2022/1/1"」でフィルタします。

Sub TEST12()
    
    '指定した期間を「含まない」
    Range("A1").AutoFilter 1, "<2021/7/1", xlOr, ">2022/1/1"
    
End Sub

実行してみます。

「2021/7/1」~「2022/1/1」を含まない

「"2021/7/1"」~「"2022/1/1"」を含まない日付をフィルタできました。

複数日でフィルタ

複数日でフィルタ

「"2021/5/1"」「"2021/8/1"」「"2021/12/1"」でフィルタ

「Array("2021/5/1", "2021/8/1", "2021/12/1"), xlFilterValues」でフィルタします。

第3引数に「xlFilterValues」を入力するのがポイントです。

Sub TEST13()
    
    '複数の日付
    Range("A1").AutoFilter 1, Array("2021/5/1", "2021/8/1", "2021/12/1"), xlFilterValues
    
End Sub

では、VBAコードを実行してみます。

「2021/5/1」「2021/8/1」「2021/12/1」でフィルタ

「"2021/5/1"」「"2021/8/1"」「"2021/12/1"」でフィルタできました。

月でフィルター

月でフィルターしてみます。

2021年の8月をフィルタします。

2021年8月の最初の日「"2021/8/1"」と最後の日「"2021/8/31"」を作成して、フィルタします。

Sub TEST14()
    
    a = "2021/8/1"
    b = WorksheetFunction.EoMonth(a, 0) '月末:2021/8/31
    
    Range("A1").AutoFilter 1, ">=" & a, xlAnd, "<=" & b
    
End Sub

月末を取得するには、「WorksheetFunction.EoMonth("2021/8/1", 0)」とすることで「"2021/8/31"」を取得することができます。

では、VBAコードを実行してみます。

「"2021/8/1"」~「"2021/8/31"」でフィルタ

「2021/8/1」~「2021/8/31」でフィルタ

「"2021/8/1"」~「"2021/8/31"」でフィルタできました。

こんな感じで、日付を作成して、比較演算子と論理演算子を組み合わせてフィルタします。

オートフィルタで日付フィルタを使う

オートフィルタで日付フィルタを使ってみます。

VBAで日付をフィルタする場合、「日付フィルタ」を使うことができます。

日付フィルタの一覧

日付フィルタはオートフィルタで日付をフィルタする際に使える機能です。

日付フィルタの引数一覧

「日付フィルタ」から設定することができます。

日付フィルタを操作する箇所

日付フィルタを使う際は、第2引数と第3引数に、次の値を入力することで使えます。

  • 明日:第2引数(3), 第3引数(11)
  • 今日:第2引数(1), 第3引数(11)
  • 昨日:第2引数(2), 第3引数(11)
  • 来週:第2引数(6), 第3引数(11)
  • 今週:第2引数(4), 第3引数(11)
  • 先週:第2引数(5), 第3引数(11)
  • 来月:第2引数(9), 第3引数(11)
  • 今月:第2引数(7), 第3引数(11)
  • 先月:第2引数(8), 第3引数(11)
  • 来四半期:第2引数(12), 第3引数(11)
  • 今四半期:第2引数(10), 第3引数(11)
  • 前四半期:第2引数(11), 第3引数(11)
  • 来年:第2引数(15), 第3引数(11)
  • 今年:第2引数(13), 第3引数(11)
  • 昨年:第2引数(14), 第3引数(11)
  • 今年の初めから今日まで:第2引数(16), 第3引数(11)

VBAコードの例を記載するとこんな感じになります。

Range("A1").AutoFilter 1, 3, 11 '明日
Range("A1").AutoFilter 1, 1, 11 '今日
Range("A1").AutoFilter 1, 2, 11 '昨日
Range("A1").AutoFilter 1, 6, 11 '来週
Range("A1").AutoFilter 1, 4, 11 '今週
Range("A1").AutoFilter 1, 5, 11 '先週
Range("A1").AutoFilter 1, 9, 11 '来月
Range("A1").AutoFilter 1, 7, 11 '今月
Range("A1").AutoFilter 1, 8, 11 '先月
Range("A1").AutoFilter 1, 12, 11 '来四半期
Range("A1").AutoFilter 1, 10, 11 '今四半期
Range("A1").AutoFilter 1, 11, 11 '前四半期
Range("A1").AutoFilter 1, 15, 11 '来年
Range("A1").AutoFilter 1, 13, 11 '今年
Range("A1").AutoFilter 1, 14, 11 '昨年
Range("A1").AutoFilter 1, 16, 11 '今年の初めから今日まで

「現在の日付」を基準にフィルタすることができます。

日付フィルタの全期間の引数一覧

日付フィルタの全期間を設定する箇所です。

日付フィルタの全期間を設定する箇所

日付フィルタの全期間の引数一覧は、こんな感じです。

第2引数と第3引数を、次のように指定します。

  • 第1四半期:第2引数(17), 第3引数(11)
  • 第2四半期:第2引数(18), 第3引数(11)
  • 第3四半期:第2引数(19), 第3引数(11)
  • 第4四半期:第2引数(20), 第3引数(11)
  • 1月:第2引数(21), 第3引数(11)
  • 2月:第2引数(22), 第3引数(11)
  • 3月:第2引数(23), 第3引数(11)
  • 4月:第2引数(24), 第3引数(11)
  • 5月:第2引数(25), 第3引数(11)
  • 6月:第2引数(26), 第3引数(11)
  • 7月:第2引数(27), 第3引数(11)
  • 8月:第2引数(28), 第3引数(11)
  • 9月:第2引数(29), 第3引数(11)
  • 10月:第2引数(30), 第3引数(11)
  • 11月:第2引数(31), 第3引数(11)
  • 12月:第2引数(32), 第3引数(11)

VBAコードの例です。

'期間内の全日付
Range("A1").AutoFilter 1, 17, 11 '第1四半期
Range("A1").AutoFilter 1, 18, 11 '第2四半期
Range("A1").AutoFilter 1, 19, 11 '第3四半期
Range("A1").AutoFilter 1, 20, 11 '第4四半期
Range("A1").AutoFilter 1, 21, 11 '1月
Range("A1").AutoFilter 1, 22, 11 '2月
Range("A1").AutoFilter 1, 23, 11 '3月
Range("A1").AutoFilter 1, 24, 11 '4月
Range("A1").AutoFilter 1, 25, 11 '5月
Range("A1").AutoFilter 1, 26, 11 '6月
Range("A1").AutoFilter 1, 27, 11 '7月
Range("A1").AutoFilter 1, 28, 11 '8月
Range("A1").AutoFilter 1, 29, 11 '9月
Range("A1").AutoFilter 1, 30, 11 '10月
Range("A1").AutoFilter 1, 31, 11 '11月
Range("A1").AutoFilter 1, 32, 11 '12月

現在の日付によらず、全期間で日付をフィルタします。

では、「日付フィルタ」で日付をフィルタしてみます。

今月でフィルタする

今月でフィルタしてみます。

この記事を記載している日は、「2021/6/21」ですので、「6月」をフィルタすることになります。

第2引数は「7」で、第3引数は「11」です。

Sub TEST15()
    
    Range("A1").AutoFilter 1, 7, 11 '今月
    
End Sub

では、VBAコードを実行してみます。

「今月」でフィルタ

「今月」でフィルタ

「今月」でフィルタできました。

月でフィルタする

「8月」でフィルタしてみます。

第2引数は「28」で、第3引数は「11」です。

Sub TEST16()
    
    Range("A1").AutoFilter 1, 28, 11   '8月
    
End Sub

では、VBAコードを実行してみます。

「8月」でフィルタ

「8月」でフィルタ

「8月」でフィルタできました。

日付フィルタも紹介しましたけども、日付をフィルタする際は、「比較演算子」と「論理演算子」を組み合わせてフィルタした方が簡単です。

おわりに

この記事では、VBAを使ってオートフィルタで日付をフィルタする方法について、ご紹介しました。

日付をフィルタする場合は、「比較演算子」と「論理演算子」を組み合わせて、フィルタするとうまくフィルタすることができます。

日付フィルタもありますけど、フィルタしたい日付を作成して「比較演算子」や「論理演算子」を使ってフィルタした方が簡単です。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

アーカイブから探す