Как проверить, пуста ли ячейка даты в Excel?

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

Для начала у меня есть 2 ячейки даты:

Dim agreedDate As Date Dim completedDate As Date 

ЭТО РАБОТЫ .. (но выглядит грязно)

 agreedDate = Worksheets("Data").Cells(Counter, 7).Value completedDate = Worksheets("Data").Cells(Counter, 9).Value If (IsEmpty(Worksheets("Data").Cells(Counter, 7).Value) = True) Or (IsEmpty(Worksheets("Data").Cells(Counter, 9).Value) = True) Then [.. do stuff] End If 

ЭТО НЕ РАБОТАЕТ – ПОЧЕМУ НЕ ?!

 agreedDate = Worksheets("Data").Cells(Counter, 7).Value completedDate = Worksheets("Data").Cells(Counter, 9).Value If (IsEmpty(agreedDate) = True) Or IsEmpty(completedDate) = True) Then [.. do stuff] End If 

Есть ли способ написать инструкцию if чистым и простым способом?

Поскольку только переменные типа Variant могут быть пустыми, вам нужен другой тест для типов Date.

Проверьте ноль:

 If agreedDate = 0 Or completedDate = 0 Then 

Но более безопасным путем было бы изменить переменные на тип Variant, а затем выполнить этот тест:

 If IsDate(agreedDate) = False Or IsDate(completedDate) = False Then 

Функция IsEmpty определяет, была ли инициализирована переменная . Если ячейка действительно пустая, она считается неинициализированной с точки зрения IsEmpty . Однако объявление переменной в VBA дает значение по умолчанию. В этом случае переменные типа даты имеют значение 0 или 30-дек-1899 00:00:00, как показано в следующем коротком фрагменте.

 Sub date_var_test() Dim dt As Date Debug.Print Format(dt, "dd-mmm-yyyy hh:mm:ss") End Sub 

Если вы хотите «убрать» свой код, вы также можете разрешить истинное логическое возвращение функции IsEmpty для решения логического состояния, а не сравнения его с True .

 If IsEmpty(Worksheets("Data").Cells(Counter, 7)) Or IsEmpty(Worksheets("Data").Cells(Counter, 9)) Then [.. do stuff] End If 

Учитывая, что False является (для всех целей и целей) нулевым, это будет работать для ваших переменных типа даты.

 If Not (agreedDate or completedDate) Then [.. do stuff] End If 

Как отмечал Excel Hero, переменная даты не может быть пустой. Фактически, переменная date является числом, поэтому вы должны иметь возможность сделать что-то вроде этого. Также обратите внимание, что в приведенном ниже коде используется значение «Value2».

 Sub test() Dim d As Date d = Range("A1").Value2 If d = 0 Then MsgBox "ok" Else MsgBox "not ok" End If End Sub 
Interesting Posts

R – Ошибка: IllegalArgumentException (Java): ваш InputStream не был ни потоком OLE2, ни потоком OOXML

Проверка Excel для нескольких значений вставки

Excel VBA Regex – как сопоставить 3 символа, если между ними могут быть другие символы

Обновление структурированных таблиц с помощью VBA Loop

Возможна пустая коллекция диапазонов Excel?

Являются ли формулы excel пересчитаны при сортировке?

Фильтр захвата ячейки / колонки excel и верхнего и нижнего колонтитула листа excel с использованием win32 :: OLE в perl

Excel – Пропустить пустые ячейки таблицы Формула

Используйте Index и Match с несколькими значениями поиска, чтобы получить один результат

'28' Из пространства стека. Worksheet_Change и Application.ScreenUpdating

Использование значений ячеек в качестве автофильтратора диапазона дат

Заполнение цвета фона в строках excel с использованием Java apache POI

Что такое тип файла, который определяет, можно ли открыть его в Excel?

Как предотвратить утечку Excel при переименовании листа в книгу с помощью UDF

VBA Excel задает переменную на 2digit после запятой

Давайте будем гением компьютера.