Как проверить значения времени Excel в Access VBA? - PullRequest
1 голос
/ 02 декабря 2010

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

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

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

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

Кто-нибудь?

ОБНОВЛЕНИЕ 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. Верно? </p>

1 Ответ

4 голосов
/ 02 декабря 2010

Существует два разных понятия:

1) Формат даты и времени

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

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

2) Вещи, которые VBA может преобразовать в дату / время

Это то, что проверяет IsDate,Согласно MS:

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

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

HTH!

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

...