2011-12-15 12 views
24

Ho usato il seguente codice VBA:Qual è la differenza tra = Empty e IsEmpty() in VBA (Excel)?

Do While .Cell(i,1) <> Empty 
    ' doing things 
    i = i+1 
Loop 

per scorrere le colonne (con i valori Doppia/intero) in Excel. Poi ho trovato un caso in cui il test restituisce False ogni volta che il valore della cella è 0. Non ho idea di quale sia la differenza tra questo caso e quelli di lavoro.

Se cambio il test per:

Do While Not IsEmpty(.Cell(i,1)) 
    .. 
Loop 

funziona benissimo. Quindi la mia domanda è: qual è la differenza tra come vengono valutati IsEmpty() e = Empty? In quali casi will = Empty restituisce True per le celle con valore 0?

+2

'Range ("A2") = 0 ''? Range ("A2") = Empty' 'true''? IsEmpty (Range ("A2")) '' False' Mi piacerebbe vedere un caso in cui un valore di cella di 0 '= Empty' restituisce False! –

+0

Hai ragione. Vedo ora che la serie che ho visto prima non contiene zeri (ho appena supposto che lo abbiano fatto), quindi il comportamento è coerente. – Christian

risposta

26

Empty riferisce ad un essere variabile al suo valore predefinito. Quindi, se si controlla se una cella con un valore di 0 = Empty, restituirebbe true.

IsEmpty si riferisce a nessun valore in fase di inizializzazione.

In poche parole, se si desidera verificare se una cella è vuota (come se nulla esiste nel suo valore), utilizzare IsEmpty. Se vuoi vedere se qualcosa è correntemente nel suo valore predefinito, usa Empty.

+1

Non mi sono reso conto che 0 è il valore predefinito di una cella di Excel, ma è bello sapere. – Christian

+4

Sì usa IsEmpty per vedere se una cella è vuota. Ma Empty è solo una costante con valore zero: non si riferisce a una variabile al suo valore predefinito: è una scorciatoia per vbEmpty che fa parte di un Enum e ha un valore pari a zero. Il valore predefinito di una cella di Excel è che non ha alcun valore (è IsEmpty): se lo assegni a una variabile numerica viene convertito a zero. –

+0

@ Jean-Francois: sei corretto: da VBA Help - La parola chiave Empty è usata come sottotipo Variant. Indica un valore variabile Variant non inizializzato. –

-4

Credo IsEmpty è solo metodo che prende valore restituito cellulare e controlla se vuoto così: IsEmpty (.Cell (i, 1)) Se ->

return .Cell(i,1) <> Empty 
+0

@Christian 'Not IsEmpty (Sheets (" Results "). Cells (i, 1))" hai pensato a "Not" nella tua logica? –

+0

Sfortunatamente, questo non può essere il mio caso sul mio sistema. Quando faccio 'Do While Not IsEmpty (Sheets (" Results "). Cells (i, 1)) Fogli (" Results "). Cells (i, 2) .Value = (Sheets (" Results "). Cells (i, 1) <> Empty) Loop' Ottengo una colonna adiacente di booleans, dove 0 corrisponde a False, mentre altri valori corrisponde a True. – Christian

+0

Not IsEmpty() dovrebbe essere logicamente equivalente a <> Vuoto, non credi? I.e. se l'istruzione <> vuota viene valutata come false, il ciclo con la condizione Not IsEmpty() dovrebbe terminare. – Christian

4

Dal Aiuto:
IsEmpty restituisce True se la variabile è inizializzata, o è impostata in modo esplicito vuoto; altrimenti restituisce False. False viene sempre restituito se expression contiene più di una variabile.
IsEmptyrestituisce solo informazioni significative per le varianti.

Per verificare se una cella è vuota, è possibile utilizzare cell(x,y) = "".
Si potrebbe eventualmente risparmiare tempo utilizzando Range("X:Y").SpecialCells(xlCellTypeBlanks) o xlCellTypeConstants o xlCellTypeFormulas

+5

'cell (x, y) =" "' restituirà True per una cella non vuota contenente '=" "'. Quindi è più coerente usare 'IsEmpty (cell (x, y))'. BTW 'cell (x, y)' restituisce un Variant, quindi è un caso da manuale per IsEmpty. –

Problemi correlati