AutoFilter DateTime values ​​- локальная проблема с десятичной точкой - PullRequest
3 голосов
/ 02 октября 2019

Фон

Пока я пытался решить проблему для другого пользователя, я столкнулся, по-видимому, с локальной проблемой.

Представьте себе несколько очень простых примеров данных (являющихся истинными значениями даты и времени):

| DateTimeVals   |
|----------------|
| 1-1-2019 01:00 |
| 2-1-2019 01:00 |
| 3-1-2019 01:00 |
| 4-1-2019 01:00 |
| 5-1-2019 01:00 |

Не нужно быть более сложным, чтобы показать вам проблему под рукой. Давайте представим, что мы хотели бы отфильтровать 3-1-2019 01:00 (3 января). Просто используя:

Range("A1").AutoFilter Field:=1, Criteria1:="3-1-2019 01:00"

Работает просто отлично, жестко закодированная строковая переменная работает, но я подумал о более динамичной фильтрации истинных числовых значений, как показано ниже.


Код

Sub test()

Dim SearchNum As Double: SearchNum = DateValue("3-1-2019") + TimeValue("1:00")
Range("A1").AutoFilter Field:=1, Criteria1:=">=" & SearchNum, Operator:=xlAnd, Criteria2:="<=" & SearchNum

End Sub

Отслеживание этой переменной с помощью WATCHES показывает следующее:

enter image description here

Но примененный фильтр показывает 0 результатов:

enter image description here

И вотнечетная часть, примененный фильтр говорит мне, что я, очевидно, фильтровал между полным значением без десятичной запятой.

enter image description here

добавление запятой вручную к этому числучисло превращается в форматированное значение даты / времени. Но результат не отображается.


Обходной путь

Я нашел способ обойти это, используя следующий код:

Sub test()

Dim str As String: str = DateSerial(2019, 1, 3) & " " & Format(TimeSerial(1, 0, 0), "hh:mm")
Range("A1").AutoFilter Field:=1, Criteria1:=str

End Sub

Вопрос

Пока я читал о том, как MS мог пренебречь AutoFilter, я думаю, что моя проблема описанадолжен быть как-то связан с локальными настройками. Как VBA вставить критерий как целое число? И как этого избежать? Как-нибудь иначе, чем мой обходной путь (или вспомогательный столбец)?


Примечание:

  • Изменение длинного номеравручную вставляя запятую, измените значение в правильном формате даты / времени.
  • Работа с TimeValue подвержена ошибкам с плавающей запятой, так как 1:00 имеет гораздо больше десятичных чисел, чем показанные. Вставка полного числового значения в строковую переменную устранила исчезновение запятой и показала отформатированное значение даты / времени, однако результат не отображается.
...