Разница между DateValue и CDate в VBA

Я новичок в VBA, и я работаю над модулем для чтения данных из электронной таблицы и расчета значений на основе дат из электронной таблицы. Я читаю переменные как String, а затем меняю значения на Date с помощью CDate. Однако я просто столкнулся с DateValue, и мне было интересно, какая разница между этими двумя функциями и какой из них лучше использовать.

Ответ 1

DateValue вернет только дату. CDate сохранит дату и время:

? DateValue("2014-07-24 15:43:06")
24/07/2014

? CDate("2014-07-24 15:43:06")
24/07/2014 15:43:06 

Аналогичным образом вы можете использовать TimeValue для возврата только временной части:

? TimeValue("2014-07-24 15:43:06")
15:43:06 

? TimeValue("2014-07-24 15:43:06") > TimeSerial(12, 0, 0)
True

Кроме того, как говорит guitarthrower, DateValueTimeValue) будет принимать только параметры String, а CDate также может обрабатывать числа. Чтобы эмулировать эти функции для числовых типов, используйте CDate(Int(num)) и CDate(num - Int(num)).

Ответ 2

CDate преобразует число или текст в дату.

CDate(41035) 'Converts to a date of 5/6/2012
CDate("1/15/2014") 'Converts to a date of 1/15/2014

DateValue преобразует дату в текстовом формате (только) в дату.

DateValue("1/15/2014") 'Converts to a date of 1/15/2014
DateValue(41035) 'Throws a mismatch error

Ответ 3

Оба CDate и DateValue при использовании в vba преобразуют значение в формат даты (dd/mm/yyyy):
1)
  LstrDate = "July 24, 2014"
  LDate = CDate(LstrDate)

2)
  LDate = DateValue("July 24, 2014")

Оба возвращают тот же результат.

Однако DateValue возвращает порядковый номер даты, если используется на уровне приложения (электронная таблица)