2015-10-29 41 views
5

Se la sensazione è questa dovrebbe essere davvero facile ma non riesco a farlo funzionare senza recuperare nuovamente il valore della cella.Come verificare se una cella della data in Excel è vuota?

per cominciare, ho le cellule 2 Data:

Dim agreedDate As Date 
Dim completedDate As Date 

QUESTO FUNZIONA .. (ma sembra disordinato)

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 

QUESTO NON FUNZIONA - perché no ?!

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 

C'è un modo per scrivere l'istruzione if in modo pulito e semplice?

+0

Hai dichiarato le variabili come tipo Data. Solo le variabili di tipo Variant possono essere vuote. –

risposta

5

Poiché solo le variabili di tipo Variant possono essere vuote, è necessario un test diverso per i tipi di data.

Controllare lo zero:

If agreedDate = 0 Or completedDate = 0 Then 

Ma un percorso più sicuro sarebbe quello di cambiare le variabili di tipo Variant e poi fare questo test:

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

Ottima risposta, questo era esattamente quello che stavo cercando! – Malin

1

Come Excel Eroe ha sottolineato, una variabile data Non può essere vuoto. In effetti, una variabile data è un numero, quindi dovresti essere in grado di fare qualcosa di simile. Inoltre, si noti che il codice seguente utilizza "Valore2".

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

Il IsEmpty function determina indicata se una variabile è stata inizializzata. Se una cella è veramente vuota, viene considerata non inizializzata dal punto di vista IsEmpty IsEmpty. Tuttavia, la dichiarazione di una variabile in VBA fornisce un valore predefinito. In questo caso le variabili del tipo data sono essenzialmente o 30-Dec-1899 00:00:00 come dimostrato dal seguente breve frammento.

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

Se si vuole 'riordinare' il codice, si potrebbe anche voler consentire il vero ritorno booleano della funzione IsEmpty per risolvere la condizione booleana piuttosto che confrontandolo con Vero.

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

Dato che False è (per tutti gli effetti) pari a zero allora questo lavoro per le variabili di tipo data.

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

Penso che il percorso migliore sia quello di andare con le varianti e usare IsDate(). Cosa succede se la cella contiene del testo ... –

+0

Le date sono sempre state un po 'divertenti. Sono numeri ma in realtà più che numeri. Sebbene sia prevalentemente accurato, la [funzione IsDate] (https://msdn.microsoft.com/en-us/library/office/gg278584.aspx) è ancora la migliore. Preferisco lavorare con la proprietà [Range.Value2] (https://msdn.microsoft.com/en-us/library/office/ff193553.aspx) e trattare le date come numeri finché non devono essere reinserite nel foglio di lavoro . – Jeeped

+0

@Excel Hero Sono d'accordo con Excel Hero. La variante deve essere utilizzata come rendimento previsto di Valore e Valore2.Se la cella contiene del testo, il passaggio del valore a una variabile di data genera un errore di runtime. Quindi la forma migliore sarebbe usare i tipi di varianti e IsDate(). Se sono necessari valori di data, è possibile assegnarli una volta verificato il valore della data. Anche se sono d'accordo sul fatto che trattare le date come numeri è più semplice se si può garantire che siano in realtà date per cominciare. – u8it