Как преобразовать и сравнить строку даты с датой в Excel

= "7/29/2011 12:58:00 PM" > NOW()

Я бы хотел, чтобы это выражение возвращало FALSE, но при этом возвращало TRUE.

Я знаю, что могу разбить дату и время на дату и время и добавить их вместе следующим образом:

= DateValue("7/29/2011") + TimeValue("12:58:00 PM") > NOW()

Но мне это кажется неэлегантным. Мне нужна простая функция или подход, который хорошо выглядит, и я уверен, что он есть, но я просто не могу его найти.

Я также знаю, что есть функция VBA под названием CDate, которая может привести строку к типу даты и времени, и это было бы идеально. Но я не понимаю, как вызвать функцию VBA в ячейке Excel.


person Gidon Wise    schedule 29.07.2011    source источник
comment
Ваши строки даты жестко запрограммированы в таких ячейках? Если да, то почему?   -  person Jean-François Corbett    schedule 29.07.2011
comment
Они есть. Есть ли другой формат для их ввода, который лучше?   -  person Gidon Wise    schedule 29.07.2011
comment
Хорошо, почему 7/29/2011 12:58:00 PM не находится в отдельной ячейке, формат которой установлен на дату? Такое жесткое кодирование строки делает ее довольно невидимой и негибкой.   -  person Jean-François Corbett    schedule 29.07.2011
comment
Ах. Так что это лучшая практика. Я собираюсь сделать это. Но в некоторых случаях формула должна иметь его, поэтому я просто приму то, что я считал самым простым ответом, который на данный момент является * 1. Спасибо и вам.   -  person Gidon Wise    schedule 29.07.2011
comment
Да, я думаю, что это хорошая практика, а ваш пример выглядит ужасной практикой! Зачем кому-то это делать?! Смотрите мой ответ ниже.   -  person Jean-François Corbett    schedule 29.07.2011


Ответы (4)


Я обновляю следующее из комментария к ответу:

Если у вас нет очень конкретной причины для этого (и прямо сейчас я не могу придумать ни одной), даты (и другие значения) действительно не должны быть «жестко закодированы» в ячейках в виде строк, как вы показываете. Такое жесткое кодирование строки делает ее невидимой и негибкой. Пользователь увидит только TRUE или FALSE без указания, что это означает.

Я бы просто поместил вашу дату 7/29/2011 12:58:00 PM в отдельную ячейку, например. A1 и установите формат ячейки в какой-либо формат даты. Тогда вы можете сказать = A1 > NOW().

Вопреки ответам @jonsca и @Tiago Cardoso, этот ответ не касается вашего конкретного вопроса, но опять же, то, что вы спрашиваете, кажется мне очень плохой практикой!

person Jean-François Corbett    schedule 29.07.2011

Умножьте строку на единицу, и функция сравнения сработает:

= 1*"7/29/2011 12:58:00 PM" > NOW()

Ответ на ваш вопрос тесно связан с комментарием @Jean-François: Почему дата интерпретируется Excel как текст, а не дата?

Как только вы узнаете это, вы сможете сделать сравнение.

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

person Tiago Cardoso    schedule 29.07.2011
comment
это круто. должен дать вам +1. но в конце концов собираемся изолировать дату. - person Gidon Wise; 29.07.2011
comment
Основная мысль этого ответа (умножьте ее на единицу, и функция сравнения сработает) должна быть размещена впереди и по центру, а не в середине третьего абзаца! Разрешаю себе это. Этот лайфхак полезно знать. +1 - person Jean-François Corbett; 29.07.2011

Вы можете обернуть вызов VBA пользовательской функцией:

Function ReturnDate(ByVal datestr As String) As Date
    ReturnDate = CDate(datestr)
End Function

который вы можете использовать так же, как формулу на вашем листе.

person jonsca    schedule 29.07.2011
comment
Я не могу придумать способ просто вызвать CDate непосредственно из формулы, но такой способ может существовать. - person jonsca; 29.07.2011
comment
я приму это, если кто-то не придумает лучший ответ. это похоже на обходной путь, хотя это хороший обходной путь. - person Gidon Wise; 29.07.2011
comment
Решение проблемы X или XY может быть очень болезненным! +1 - person Jean-François Corbett; 29.07.2011

Самый простой способ сделать это — создать функцию VBA, которая использует CDATE и возвращает сравнение. Затем вызовите функцию из ячейки Excel.

Функция VBA

Public Function compareDate(ByVal inputDate As String) As Boolean
  compareDate = CDate(inputDate) > Now()
End Function

Затем в вашей электронной таблице просто выполните

=compareDate("YOUR DATE")

Функция вернет «FALSE», если она старше, и «TRUE», если она новее, чем Now().

person Chris Flynn    schedule 29.07.2011
comment
То же, что и ответ @jonsca, за исключением косметики - person Jean-François Corbett; 29.07.2011