Application.Worksheetfunction.Median возвращает ошибку «объект не поддерживает свойство или метод» - PullRequest
0 голосов
/ 09 июля 2019

У меня есть фрагмент кода, в котором я беру время и дату и разделяю дату и время на два разных столбца, а затем присваиваю значение «A» или «B» в зависимости от того, находится ли результат между двумявремя или нет.В настоящее время он заполняет два столбца, но возвращает ошибку в cel.Offset (0, 3) .Value = Application.WorksheetFunction.IF (cel.Offset (0, 2) .Value = (Application.WorksheetFunction.Median ("19:00:00 "," 06:30:00 ", cel.Offset (0, 2) .Value))," A "," B ").

For Each cel In src
    cel.Offset(0, 1).Value = VBA.Format(cel.Value, "mm/dd/yyyy")
    cel.Offset(0, 2).Value = VBA.Format(cel.Value, "hh:mm:ss")
    cel.Offset(0, 3).Value = Application.WorksheetFunction.IF(cel.Offset(0, 2).Value = (Application.WorksheetFunction.Median("19:00:00", "06:30:00", cel.Offset(0, 2).Value)), "A", "B")
Next

Как я могусделать это возвращение правильной рабочей смены "A" или "B"?

1 Ответ

0 голосов
/ 09 июля 2019

Две вещи:

(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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...