AutoFilterメソッドで抽出する場合、日付値を持つフィールドは要注意です。
AutoFilterメソッドの引数
引数 | 省略可否 | 用途 |
---|---|---|
Field | 必須 | 抽出対象のフィルター番号を指定する |
Criteria1 | 抽出条件1を指定する | |
Operator | 抽出種類をXlAutoFilterOperator列挙の定数で指定する | |
Criteia2 | 抽出条件2を指定する |
XlAutoFilterOperator列挙の定数
定数 | 値 | 用途 |
---|---|---|
xlAnd | 1 | Criteria1とCriteria2のAnd条件で抽出 |
xlOr | 2 | Criteria1とCriteria2のOr条件で抽出 |
日付値を持つ表
普通に日付値で抽出してみる
たとえば、下記のコードで試してみます。上の表の場合、日付値を持つフィールドの番号は 2 です。
日付が2022/1/3のレコードを抽出してみます。
Sub 日付値で抽出()
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:= "2022/1/3"
End Sub
<注意>条件の日付値は、field2(C列)に表示されている表示形式の文字列で指定します。
InputBoxから入力された日付値で抽出する
問題なく抽出できました。しかし、普通はユーザーに日付を指定してもらうはずです。
Sub 日付で抽出2()
Dim trgtDay As Date
trgtDay = Application.InputBox( _
prompt:="日付を入力してください", _
Title:="日付指定")
'抽出する
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:=trgtDay
End Sub
実行すると次のようになります。
<注意>条件の日付値は、field2(C列)に表示されている表示形式での文字列で指定します。
うまく抽出できません。
これは、変数trgtDateの型をDate型にしたからです。
String型に直すと正しく抽出します。
Sub 日付で抽出3()
Dim trgtDay As String
trgtDay = Application.InputBox( _
prompt:="日付を入力してください", _
Title:="日付指定")
'抽出する
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:=trgtDay
End Sub
指定セルに入力された日付値で抽出する
指定セル(例ではセルG2)に入力された日付値で抽出する場合のコードはこんな感じでしょうか。
Sub 日付で抽出4()
Dim trgtDay As String
trgtDay = Range("G2").Value
'抽出する
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:=trgtDay
End Sub
<注意1>これでうまく抽出できますが、「セルG2」の書式設定を「文字列」にしておくことを忘れないで下さい。
<注意2>「セルG2」には field2(C列)に表示されている表示形式での文字列を入力しないといけません。
「期間」で抽出する
日付値から日付値までの期間に該当するレコードを抽出する場合は、Criteria1, Operator, Criteria2の3つの引数を使います。
下のコードは、セルG2の日付値からセルI2の日付値までの期間に該当するレコードを抽出します。
<重要>ところでExcelは期間計算するとき、表示形式に関わらずシリアル値ベースで計算を行い、抽出を行うようです。したがって、セルG2やセルI2の書式設定は何でもOK。field2(C列)の表示形式も気にする必要がありません。
VBAの方の変数の型もString型でもDate型でもOKです。
Sub 日付で抽出5()
Dim startDay As Date
Dim endDay As Date
startDay = Range("G2").Value
endDay = Range("I2").Value
'抽出する
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:=">=" & startDay, _
Operator:=xlAnd, _
Criteria2:="<=" & endDay
End Sub
<注意>9行目と11行目の条件式に注意して下さい。
「Criteria1 :=」「Criteia2 :=」の次に「 “>=” & startDay」、「 “<=” & endDay 」と書きます。
日付値の表示形式を気にしないで抽出する
「期間」で抽出する場合、日付値の表示形式を気にしないでいいのはわかりました。
冒頭の事例のように「特定の日付値」で抽出する場合でも、表示形式を気にしないで済むといいですよね。
実は簡単です。期間で抽出するように見せかければいいんです。
指定セルに入力された日付値で抽出する (表示形式無視バージョン)
Sub 日付で抽出6()
Dim startDay As Date
Dim endDay As Date
startDay = Range("G2").Value
endDay = startDay
'抽出する
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:=">=" & startDay, _
Operator:=xlAnd, _
Criteria2:="<=" & endDay
End Sub
5行目を endDay = startDay に変えただけです。
InputBoxから入力された日付値で抽出する ( 表示形式無視バージョン)
Sub 日付で抽出7()
Dim startDay As Date
Dim endDay As Date
startDay = Application.InputBox( _
prompt:="日付を入力してください", _
Title:="日付指定")
endDay = startDay
'抽出する
Range("B2").CurrentRegion.AutoFilter _
field:=2, _
Criteria1:=">=" & startDay, _
Operator:=xlAnd, _
Criteria2:="<=" & endDay
End Sub
同様に7行目を endDay = startDay にしています。
まとめ
日付値で抽出を行う場合、表示形式を気にしないで済むようするには、マクロ上は「期間」で抽出すればいいということです。
Excelをだましているみたいで楽しいですね。
ユーザーが日付を入力しさえすれば表示形式を無視できるというのが最大のメリットです。
コメントを残す
コメントを投稿するにはログインしてください。