IsEmpty e Nothing

 

Queste che seguono sono possibili istruzioni che si possono incontrare in talune routines:

If VarOggetto Is Nothing Then ...
Set MyObject = Nothing
If IsEmpty(VarOggetto) Then ...
VarOggetto= Empty
MioTest = IsEmpty(VarOggetto)

Addirittura è possibile incontrarle anche nella stessa routine.

In esse vengono usati "Nothing " e "IsEmpty". Entrambe danno la sensazione di voler esaminare o porre qualcosa nella condizione di vuoto, nullo.

Tuttavia c'è una sostanziale differenza tra i due tipi di istruzioni. E' come, se tra i comuni mortali, si parlasse di una casa:

un conto è chiedersi se la casa esiste ed un altro è chiedersi se nella casa c'è qualcuno.

In una determinata località una casa (il contenitore) può esserci o no e, se c'è, può essere distrutta per creare spazio sul territorio (Nothing).

Solo se la casa esiste può essere abitata o non abitata (IsEmpty) da persone (il contenuto).

Immaginiamo ancora per un attimo se mai ci potesse venire in mente di controllare la presenza di qualche persona in una casa che non esiste: prima consideriamo l'idea se la casa esiste e solo dopo averne constatata l'esistenza ne cerchiamo gli eventuali abitanti.

La parola chiave "Nothing " può essere usata per controllare se un oggetto (il contenitore) esiste (If VarOggetto Is Nothing) o per distruggerlo (Set VarOggetto = Nothing), quindi liberare la memoria.

La funzione "IsEmpty" verifica se l'oggetto, già esistente, contiene o meno qualche valore (il contenuto) (If IsEmpty(VarOggetto)) o ne cancella il contenuto (VarOggetto = Empty).

ATTENZIONE: la funzione "IsEmpty" si applica a qualsiasi variabile, non solo a quelle che si riferiscono ad oggetti, contrariamente a "Nothing " che si applica solo a variabili-oggetto.

Questo può essere un ulteriore test da eseguire su una variabile di tipo Variant:

Dim A As Variant
If IsEmpty(A) Then
MsgBox "la variabile generica è vuota"
Else
MsgBox "la variabile contiene " & A
End If

Indica se la variabile sottoposta al test contiene semplicemente uno 0 (zero) o una stringa vuota (""), o se contiene un valore significativo.

Ora, forse, possiamo comprendere che diversa è la creazione di un contenitore dal suo contenuto, come diversa è la la sua distruzione dallo svuotamento.

Un oggetto inesistente non può essere riempito.

Un oggetto anche se vuoto continua ad occupare spazio in memoria.

Si libera spazio in memoria solo con la distruzione dell'oggetto.

Questo che segue è un piccolo test ed esempio che ho preparato per l'occorrenza. L'esempio è banale e non ha alcun senso usarlo così come si presenta. Tuttavia è possibile prelevare da questo le singole istruzioni ed adattarle nei nostri codici.

Sub TestEseguitoSuVarOggetto()
Dim VarOggetto As Range
Dim MioTest As Boolean
Dim A As Variant
If VarOggetto Is Nothing Then ' se la variabile oggetto non esiste
Set VarOggetto = Range("A1") ' creiamo una variabile oggetto di tipo Range
End If
If IsEmpty(VarOggetto) Then ' se la variabile oggetto è vuota
VarOggetto = "Ciao" ' vi poniamo una stringa
End If
A = VarOggetto 'ne leggiamo il contenuto: a = "Ciao"
MioTest = IsEmpty(VarOggetto) 'eseguiamo un primo test: = falso
VarOggetto = Empty ' la vuotiamo del suo contenuto
A = VarOggetto 'ne leggiamo ancora il contenuto: a = vuoto
MioTest = IsEmpty(VarOggetto) 'eseguiamo un nuovo test: = vero
VarOggetto = 1234 ' la popoliamo con un valore numerico
A = VarOggetto 'eseguiamo una nuova lettura del suo contenuto: a = 1234
MioTest = IsEmpty(VarOggetto) 'nuovo test: = falso
VarOggetto = Empty ' la vuotiamo ancora
A = VarOggetto 'nuova lettura: a = vuoto
MioTest = IsEmpty(VarOggetto) 'nuovo test: = vero
Set VarOggetto = Nothing ' distruzione della variabile oggetto
End Sub

Con questo vi auguro buon lavoro.