2015-10-29 2 views
5

Если вы чувствуете, что это должно быть очень просто, но я не могу заставить его работать, не возвращая значение ячейки снова.Как проверить, пуста ли ячейка даты в 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 чистым и простым способом?

+0

Вы указали переменные как тип Date. Только переменные типа Variant могут быть пустыми. –

ответ

5

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

Проверка на ноль:

If agreedDate = 0 Or completedDate = 0 Then 

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

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

Отличный ответ, это именно то, что я искал! – Malin

1

Как Excel Герой отметил, переменную даты не может быть пустым. Фактически, переменная 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 
2

IsEmpty function определяет указанный ли переменная инициализирована. Если ячейка действительно пустая, то она считается неинициализированной с точки зрения IsEmpty. Однако объявление переменной в VBA дает значение по умолчанию. В этом случае переменными типа даты являются, по существу, или 30-Dec-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 разрешить логическое условие, а не сравнивая его с Истинного.

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

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

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

Я думаю, что лучший маршрут - пойти с вариантами и использовать IsDate(). Что, если в ячейке есть текст ... –

+0

Даты всегда были немного забавными. Они цифры, но на самом деле больше, чем числа. В то время как в основном точная функция [IsDate Function] (https://msdn.microsoft.com/en-us/library/office/gg278584.aspx) по-прежнему является наилучшей догадкой. Я предпочитаю работать с свойством [Range.Value2] (https://msdn.microsoft.com/en-us/library/office/ff193553.aspx) и обрабатывать даты как числа, пока они не будут возвращены в рабочий лист , – Jeeped

+0

@Excel Hero Я согласен с Excel Hero. Вариант должен использоваться как предполагаемый возврат значения и Value2.Если ячейка содержит текст, то передача его значения переменной даты приводит к ошибке во время выполнения. Таким образом, лучшей формой будет использование вариантов типов и IsDate(). Если значения даты необходимы, их можно назначить после подтверждения значения даты. Хотя я также согласен с тем, что лечение дат как чисел проще всего, если вы можете гарантировать, что они на самом деле являются датами для начала. – u8it

Смежные вопросы