Le Userform e la X di chiusura.

Quando si progetta una UserForm, in genere inseriamo sicuramente almeno due commandbutton di cui uno preparato per uscire dalla form e chiuderla. Questo perchè, oltre ad ottenere una presentazione un pò più "professionale", possiamo inserire, appunto prima della chiusura, una serie di controlli che impediscano la chiusura se non è stato eseguito un determinato passaggio, per esempio il controllo se in una textbox è stato inserito un nome invece di una data. Questa verifica avrebbe il compito di impedire la chiusura fintantochè non si sia corretto l'errore. Ma l'utente, anzichè adoperare il commandbutton preposto alla chiusura, potrebbe adoperare la famosa X posta a destra, in alto, che serve, in tutte le finestre di Windows, a chiudere la finestra stessa, e questo manderebbe alle ortiche tutto il costrutto predisposto al controllo. Presto fatto : eliminiamo la X così non si potrà utilizzare. Ma le Userform di Excel non possiedono la proprietà " ControlBox " che, impostata a False, eliminerebbe detta X, come succede sulle Form di VisualBasic, e quindi sarà "dura" eliminarle. Per fortuna esiste però il modo, se non di  eliminare la X, di IMPEDIRNE la chiusura. Quando si chiude una form, sia che si usi la X, sia che si usi l'istruzione " UnLoad Me " nel commandbutton di uscita, richiamiamo l'evento "QueryClose" della UserForm, che quindi sfrutteremo per impedire la chiusura : richiamando detto evento nella UserForm, scriveremo questa semplice istruzione : Cancel = vbNo, e questa sarà la nostra routine:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = vbNo
End Sub

Premendo sulla X della form in esecuzione, sarà impossibile chiuderla, ma Attenzione!!, poichè come detto, lo stesso evento verrebbe richiamato anche dall'istruzione posta nel commandbutto preposto all'uscita, e quindi non si uscirebbe più, dovremo sostituire, in questo commandbutton, l'istruzione "UnLoad Me" con l'istruzione " End ", che salta tutto e chiude la finestra liberando anche la memoria.

Un altro metodo da seguire, è quello di inserire nell'evento "QueryClose", la seguente istruzione, che attiverebbe una finestra di messaggio con due pulsanti, SI e NO, lasciando quindi all'utente la libertà di scelta, ma avvisandolo opportunamente di ciò che sta facendo. Con questa soluzione, l'istruzione nel commandbutton preposto all'uscita dovrebbe essere " UnLoad Me " anzichè " End ", che sortirebbe lo stesso effetto richiamando "QueryClose". Questa è la routine:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Cancel = (MsgBox("Sicuro di voler chiudere la finestra ?", vbYesNo) = vbNo)
End Sub

Potrete decidere ovviamente, quale messaggio far apparire. Buon lavoro.