Две вещи:
(1) Форматирование ячейки не меняет ее значения, только способ отображения данных. Таким образом, ячейка .offset(0, 1)
и .offset(0, 1)
будет содержать одно и то же значение. Если вы хотите проверить только временную часть ячейки, вам придется извлечь ее.
В VBA вы можете сделать это, например, используя функцию TimeValue
, или TimeSerial
, или вы можете выполнить математику: дата внутренне сохраняется как число, целая часть, представляющая дату, десятичная часть - время. Все следующее будет работать:
Dim t as Date ' Note that there is no Time datatype in VBA
' Get the time part of a date
t = TimeValue(.offset(0, 2))
' Get the time by extracting hour, minute and second
t = TimeSerial(hour(.offset(0, 2)), minute(.offset(0, 2)), second(.offset(0, 2)), 0)
' Get the time by subtracting the `Date`-part
t = .offset(0, 2) - int(.offset(0, 2))
(2) Я полагаю, что ваша проблема связана со склеиванием некоторых Функций Worksheet . Но пока вы находитесь в VBA, нет необходимости использовать WorksheetFunction
только для проверки, находится ли значение между 2 другими значениями. Просто используйте оператор if:
Dim t As Date ' There is no Time datatype in VBA
t = TimeValue(cel.Offset(0, 2))
If t >= TimeValue("06:30:00") And t <= TimeValue("19:00:00") Then
cel.Offset(0, 3) = "A"
Else
cel.Offset(0, 3) = "B"
End If
или, если вы предпочитаете
cel.Offset(0, 3) = IIf(t >= TimeValue("06:30:00") And t <= TimeValue("19:00:00"), "A", "B")