Как проверить, пуста ли ячейка даты в 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 чистым и простым способом?

3 ответов


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

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

If agreedDate = 0 Or completedDate = 0 Then

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

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

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

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

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

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