2015-10-29 33 views
5

Jeśli tak się czujesz, to powinno być naprawdę łatwe, ale nie mogę go uruchomić bez ponownego pobierania wartości komórki.Jak sprawdzić, czy komórka z datą w programie Excel jest pusta?

Na początek, mam 2 Data komórki:

Dim agreedDate As Date 
Dim completedDate As Date 

to działa .. (ale wygląda niechlujny)

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 

to nie zadziała - DLACZEGO NIE ?!

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 

Czy istnieje sposób, aby napisać instrukcję if w czysty i łatwy sposób?

+0

Użytkownik zadeklarował zmienne jako typ Data. Tylko zmienne typu Wariant mogą być puste. –

Odpowiedz

5

Ponieważ tylko zmienne typu Variant mogą być puste, potrzebny jest inny test typów dat.

Sprawdź zera:

If agreedDate = 0 Or completedDate = 0 Then 

Ale bezpieczniejsza droga byłoby zmienić zmienne typu Variant, a następnie wykonaj test:

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

Świetna odpowiedź, to było dokładnie to, czego szukałem! – Malin

1

Jak Excel Hero wskazał, zmienna data nie może być pusty. W rzeczywistości zmienną daty jest liczba, więc powinieneś być w stanie zrobić coś takiego. Zauważ też, że poniższy kod używa "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 określa wskazane czy zmienna została zainicjowana. Jeśli komórka jest naprawdę pusta, uważa się, że nie została zainicjowana z punktu widzenia Isoffy IsEmpty. Jednak deklarowanie zmiennej w VBA daje jej wartość domyślną. W tym przypadku zmiennymi typu daty są zasadniczo lub 30-Dec-1899 00:00:00, co zostało przedstawione w poniższym krótkim urywku.

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

jeśli chcesz „posprzątać” swój kod, można również chcą, aby umożliwić prawdziwą logiczną powrót funkcji isEmpty rozwiązać logiczną warunku zamiast porównując ją do Prawdziwego.

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

Zważywszy, że Fałsz jest (dla wszystkich zamiarów i celów) zerowy to będzie pracować dla zmiennych typu data.

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

Myślę, że najlepszą opcją są warianty i użycie IsDate(). Co jeśli komórka ma w nim tekst ... –

+0

Daty zawsze były trochę zabawne. To liczby, ale w rzeczywistości więcej niż liczby. Chociaż jest to w najwyższym stopniu dokładne, [IsDate Function] (https://msdn.microsoft.com/en-us/library/office/gg278584.aspx) nadal jest najlepszym odgadnięciem. Wolę pracować z właściwością [Range.Value2] (https://msdn.microsoft.com/en-us/library/office/ff193553.aspx) i traktować daty jako liczby, dopóki nie zostaną one ponownie umieszczone w arkuszu roboczym . – Jeeped

+0

@Excel Hero Zgadzam się z programem Excel Hero. Wariant powinien być używany jako zamierzony zwrot wartości i wartości2.Jeśli komórka zawiera tekst, przekazanie jej wartości zmiennej daty powoduje błąd czasu wykonania. Najlepszą formą byłoby użycie typów wariantów i IsDate(). Jeśli wartości daty są potrzebne, można je przypisać po zweryfikowaniu wartości daty. Chociaż zgadzam się również, że traktowanie dat jako liczb jest najłatwiejsze, jeśli możesz zagwarantować, że faktycznie są to daty. – u8it