Как исправить фильтр даты VBA, так как он не собирает все даты, попадающие в мой диапазон - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь создать фильтр, который отфильтровывает все даты, попадающие в выбранные мной даты. Даты, которые я выберу, всегда будут отражать целый месяц.

Например, если мне нужны данные за май 2019 года, я введу дату начала как 01/05/2019, а дату окончания - как 31 мая 2019 года.

Мой фильтр данных должен будет забрать все строки, которые проходят через мою дату начала. Таким образом, в нем должны быть указаны целые календарные годы (01/01/2019 - 31/12/2019), кварталы (01/04/2019 - 30/06/2019) и любые даты, которые охватывают май месяц.

В настоящее время мой фильтр собирает только целые календарные годы и некоторые (но не все) точные даты, такие как 01/05/2019 - 31/05/2019. Поэтому я упускаю много информации, например даты, которые выпадают в виде кварталов, или в течение нескольких месяцев, окружающих май.

Я попытался поиграть с тем, как он фильтрует, перемещаясь вокруг знака «меньше» и «больше, чем», но это просто означало, что многие сделки стали исключены.

Я использую этот фильтр в другой книге с гораздо меньшим количеством данных, и он собирает все данные. Принимая во внимание, что в этой книге намного больше данных, и даты начала сильно различаются, поэтому я теряю около половины данных, которые мне нужны.

Sub Filter()
    Dim lngStart As Long, lngEnd As Long
    lngStart = Range("AI1").Value 'this is the start date
    lngEnd = Range("AI2").Value 'this is the end date

    Range("G2:G5000").AutoFilter field:=7, _ 'this is the start date column
        Criteria1:="<=" & lngEnd, _
        Operator:=xlAnd, _
        Criteria2:="<=" & lngEnd

    Range("H2:H5000").AutoFilter field:=8, _ 'this is the end date column
        Criteria1:=">=" & lngStart, _
        Operator:=xlAnd, _
        Criteria2:=">=" & lngStart


End Sub

Я бы хотел, чтобы все мои данные, которые проходят до мая 2019 года (пример месяца), отображались при нажатии на мой фильтр. Он показывает только одну сделку за месяц и одну из сделок за квартал, когда их еще пять.

1 Ответ

0 голосов
/ 15 мая 2019

Даты хитрые в фильтрах 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 в приведенном сценарии.

...