Даты хитрые в фильтрах VBA. С одной стороны, тип данных VBA Date не совсем совпадает со значением Excel, отформатированным как дата.
И я думаю, что ваша логика тоже была немного не такой.
Похоже, это работает с вашими примерами данных.
Sub Filter()
Dim lngStart As Long, lngEnd As Long, fltrRng As Range
lngStart = Range("J1").Value 'this is the start date
lngEnd = Range("J2").Value 'this is the end date
Set fltrRng = Range("A2:H5000")
With fltrRng
.AutoFilter field:=7, _
Criteria1:=">=" & CDbl(lngStart)
.AutoFilter field:=8, _
Criteria1:="<" & CDbl(lngEnd)
End With
End Sub
Обратите внимание, что мы определили весь диапазон фильтра, но я бы определил его по-другому и динамически, чтобы не охватывать больше строк, чем необходимо.
With Worksheets("sheet1")
Set fltrRng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 8).End(xlUp))
End With
Кроме того, мы преобразовали lngStart
и lngEnd
в тип данных Double, что позволяет хранить даты в Excel на листе. Вы могли бы просто объявить их как типа Double. Итак, со всем этим:
Sub Filter()
Dim lngStart As Double, lngEnd As Double, fltrRng As Range
lngStart = Range("J1").Value 'this is the start date
lngEnd = Range("J2").Value 'this is the end date
With Worksheets("sheet1")
Set fltrRng = .Range(.Cells(1, 1), .Cells(.Rows.Count, 8).End(xlUp))
End With
With fltrRng
.AutoFilter field:=7, _
Criteria1:=">=" & lngStart
.AutoFilter field:=8, _
Criteria1:="<" & lngEnd
End With
End Sub
Наконец, логика должна утверждать, я полагаю, что вы хотите даты, когда
- начальный столбец равен или больше даты начала AND
- конечный столбец меньше конечной даты (которую вы ввели как одну дату после фактической желаемой конечной даты, что является правильным.
EDIT:
Другая проблема заключается в том, что некоторые из ваших дат не являются «настоящими датами Excel». Другими словами, они представляют собой текстовые представления дат в формате, отличном от региональных настроек Windows, где значение «Месяц» составляет> 12.
Эта проблема обычно возникает, когда текстовый или CSV-файл ОТКРЫТ, а не ИМПОРТ, и формат даты в файле отличается от формата даты в региональных настройках Windows для компьютера.
ИМПОРТИРУЯ CSV-файл, можно указать формат даты входящих данных и избежать этой проблемы.
Чтобы продемонстрировать это в предоставленном вами файле, измените фильтрующую часть макроса, чтобы также подбирать текстовые даты. например:
With fltrRng
.AutoFilter field:=7, _
Criteria1:=">=" & lngStart, _
Operator:=xlOr, _
Criteria2:=Format(lngStart, """*""/mm/yyyy")
.AutoFilter field:=8, _
Criteria1:="<" & lngEnd, _
Operator:=xlOr, _
Criteria2:=Format(lngEnd - 1, """*""/mm/yyyy")
End With
Однако это далеко от идеала, потому что, скорее всего, даже даты, которые отображаются как «реальные даты Excel», вероятно, были переведены неправильно. Другими словами, если файл CSV содержит 05/01/2019
, что означает 5-Jan-2019
, он будет переведен в 1-May-2019
в приведенном сценарии.