Фон
Пока я пытался решить проблему для другого пользователя, я столкнулся, по-видимому, с локальной проблемой.
Представьте себе несколько очень простых примеров данных (которые являются истинными значениями даты и времени):
| 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
показывает следующее:
Но примененный фильтр показывает 0 результатов:
И вот нечетная часть, примененный фильтр говорит мне, что я, по-видимому, отфильтровал полное значение без десятичной запятой.
Добавление запятой к этому числу вручную превращало число в форматированное значение даты/времени. Но результат не показан.
Временное решение
Я нашел способ обойти это, используя следующий код:
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
имеет гораздо больше десятичных знаков, чем показанные. Вставка полного числового значения в строковую переменную решила проблему исчезновения запятой и показала отформатированное значение даты/времени, однако результат не отображается.
1:00
на самом деле0,0416666666666667
. Помещение43467.0416666666666667
в качестве критерия фактически отображалось как3-1-2019 1:00
в фильтре, однако результат не отображается.... - person JvdV   schedule 02.10.2019