2010-12-02 8 views
1

Я обрабатываю книгу Excel с помощью Access VBA (см. Reading an Excel workbook from Access), и теперь я хочу проверить, содержит ли ячейка действительное значение времени. Для дат я использую IsDate(), и он отлично работает.Как проверить значения Excel в Access VBA?

Но со значениями времени это не так (поскольку IsTime() не используется, я также использую IsDate() для значений времени). Или я должен использовать IsNumeric, потому что значения времени хранятся как удваиваются?

С «12:00:00» (с пространством) IsDate() дает TRUE (!?), Но сам Excel не распознает его как значение времени, отладчик VBA также показывает его как текстовую строку.

С «12:00:00» IsDate() дает FALSE, но сам Excel распознает его как значение времени, отладчик VBA показывает значение 0,5.

Кто-нибудь?

UPDATE 9/12:

Благодаря @belisarius и @ mwolfe02 Я нашел это для моей ситуации:

/* Valid time value */ 
IsDate() = False, 
IsNumeric() = True, 
TypeName() = Double 

/* Numeric (no time) value */ 
IsDate() = False, 
IsNumeric() = True, 
TypeName() = Double 

/* Valid date value */ 
IsDate() = True, 
IsNumeric() = False, 
TypeName() = Date 

/* Invalid time value (e.g. with leading space as in above example) */ 
IsDate() = True, 
IsNumeric() = False, 
TypeName() = String 

Так что мне нужно только, чтобы проверить, если TypeName() возвращает Double и IsNumeric() True и во избежание путаницы с «нормальными» числовыми значениями, если значение = 0 и < 1. Правильно?

ответ

4

Есть два разных понятия:

1) Дата & Формат времени

При форматировании ячейки в Excel, чтобы содержать дату (и/или) времени, Excel использует внутреннее представление. Согласно MS:
По умолчанию 1 января 1900 года является серийным номером 1, а 1 января 2008 года - серийный номер 39448, поскольку он составляет 39 448 дней после 1 января 1900 года. Microsoft Excel для Macintosh использует другую систему дат по умолчанию. Числа справа от десятичной точки в серийном номере представляют время; цифры слева представляют дату. Например, серийный номер .5 представляет время 12:00.

И все. Даты и время сохраняются как десятичные числа.

2) То, что VBA может преобразовать в дату/время

Это то, что IsDate чеки. Согласно МС:

Возвращает логическое значение, указывающее, может ли выражение быть преобразовано в дату.
Истина, возвращаемая IsDate, не означает, что ячейка была отформатирована как дата/время, она просто сообщает вам, что вы может преобразовать это значение в дату/время. Но хуже: функция может возвращать разные значения для разных платформ: В Microsoft Windows диапазон действительных дат составляет 1 января 100 г.н.э. до 31 декабря 9999 г. А.Д .; диапазоны варьируются между операционными системами.

Ясно, что Excel не подтвердил содержимое ячейки как дату/время.Это почти наверняка текст, содержащий все символы, введенные пользователем (как пространство в вашем примере). Возврат IsDate() сообщает вам, что VBA не может преобразовать значение в дату, но, возможно, вы можете, если знаете формат (и написать специальную функцию для преобразования).

HTH!

Редактировать Я думаю, что ответ на this question может вам тоже помочь.

+0

Спасибо за ваш исчерпывающий ответ. Я все еще не полностью понимаю проблему, но для моей ситуации у меня есть правильная информация (я думаю), я добавлю свои выводы в качестве ответа на мой вопрос – waanders 2010-12-09 14:36:52