Cosa sono e come usare le MessageBox (MsgBox)

Premesso che in VBA la "MsgBox" è una "funzione", la guida di Excel la definisce come una "finestra di dialogo". In effetti, avendo la possibilità di poter scegliere tra due pulsanti: SI e NO, è come se si dialogasse con la domanda che appare nella finestra, rispondendo ad  una delle due opzioni. In realtà (e questo e solo ciò che penso io) per "finestra di dialogo" si dovrebbe intendere una finestra nella quale sia possibile inserire delle variabili, come accade con le InputBox (che è una finestra di introduzione dati (quindi variabili)- vedi in questa stessa sezione : "usare le InputBox").

La funzione MsgBox di Excel sfrutta una libreria presente nel SistemaOperativo (Windows) inserita dai progettisti del SO per segnalarci gli errori di Sistema. In Excel, tramite il VBA, è possibile richiamare questa libreria e "pilotare" la comparsa di messaggi con le opportune istruzioni : la più semplice,è questa:

MsgBox (chiama la finestra del messaggio) " Ciao!!!" (tra doppi apici, il messaggio che apparirà nella finestra)

Le finestre di messaggio, d'ora in avanti chiamate msgbox, saranno associate ad eventi decisi da noi per fornire indicazioni, per avvisare di un errore, per dare una conferma, per una descrizione, per obbligare una scelta, per...per...per... chi più ne ha, più ne metta.

La Sintassi (in programmazione) da usare è:
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
Per la spiegazione degli argomenti predefiniti rimando alla Guida in linea, sottolineando solo il significato della parola prompt : con questa si intende il messaggio che vogliamo sia visualizzato; mentre di seguito riporto le Costanti dell'argomento "buttons" che sono quelle che ci consentono di scegliere il "tipo" di msgbox che vogliamo far apparire: dal più semplice (con un bottone di OK) a quelle con 2 o 3 pulsanti. Gli  argomenti sono opzionali, cioè si possono non inserire. Vediamole sotto (non tutte):

Costante

Valore

Descrizione di come appare

vbOKOnly
VbOKCancel
VbAbortRetryIgnore
VbYesNoCancel
VbYesNo
VbRetryCancel
VbCritical
VbQuestion
VbExclamation
VbInformation

0
1
2
3
4
5
16
32
48
64

Visualizza solo il pulsante OK.
Visualizza i pulsanti OK e Annulla.
Visualizza i pulsanti Termina, Riprova, e Ignora.
Visualizza i pulsanti Sì, No e Annulla.
Visualizza i pulsanti Sì e No.
Visualizza i pulsanti Riprova e Annulla.
Visualizza l'icona di messaggio critico.
Visualizza l'icona di richiesta di avviso.
Visualizza l'icona di messaggio di avviso.
Visualizza l'icona di messaggio di informazione.

Quando adoperiamo una costante, la sintassi dell'istruzione sarà diversa dal primo esempio, e andrà quindi compilata:

MsgBox ("Ciao !!!", vbInformation)

Solo che se adoperiamo questa istruzione il debugger ci segnala un errore di compilazione: è necessario assegnare l'istruzione ad una variabile, di tipo String (e va dimensionata) o di tipo Variant e si può omettere il dimensionamento (Dim), per cui sarà sufficiente impostare la nostra istruzione così :

dimmi = MsgBox ("Ciao !!!", vbInformation)

ed otterremo questo risultato:

La lunghezza di un messaggio può arrivare fino a circa 1024 caratteri, dipende dal tipo di carattere usato (i caratteri (font) normalmente usati, non occupano tutti uno stesso "spazio": in una stringa di testo, il carattere " i ", per esempio, occupa meno spazio di una " a " o di una " g ", come pure un carattere minuscolo occupa meno spazio delle stesso maiuscolo. Forse non tutti sanno che l'unico carattere che mantiene lo stesso spazio per ogni lettera, è il Courier). Se il messaggio è suddiviso su più righe, è possibile includere, tra ciascuna coppia di righe, un ritorno a capo (Chr(13)), un carattere di avanzamento riga (Chr(10)) o una sequenza ritorno a capo-avanzamento riga (Chr(13) & Chr(10)). Il caratteri appena esposti, possono essere sostituiti dalle costanti corrispondenti, come nello specchietto sotto:

vbCr       può sostituire  Chr(13)

vbLf       può sostituire   Chr(10)

vbCrLf   può sostituire   Chr(13) + Chr(10)

Questo sotto, è un esempio su come si può compilare codice per far apparire un messaggio su più righe, all'apertura della cartella di lavoro:

Sub Messaggio()
Dim Lem As String

Lem = Lem & "Questo è un esempio :" & vbLf & vbLf
Lem = Lem & "L'Autore è:" & Chr(13) & vbLf
Lem = Lem & "Pinco Pallino" & vbLf
Lem = Lem & "Questo Programma" & vbLf
Lem = Lem & "è tutelato dai" & vbLf & vbLf
Lem = Lem & "diritti d'Autore !!" & vbLf
Lem = Lem & "(non esiste, è falso)" & vbLf & vbLf
Lem = Lem & "del Codice VBa di questo messaggio" & vbLf
Lem = Lem & "si raccomanda di fare tutte" & vbLf
Lem = Lem & "le variazioni che volete." & vbLf
Lem = Lem & "l'Autore lo concede (?!?!?)" & vbLf
Lem = Lem & "Ha......Ha......Ha"

MsgBox Lem
End Sub

e questo è il messaggio generato dal codice sopra:

Ora vediamo come poter gestire due tipi di msgbox piuttosto utilizzate. vbYesNo e vbYesNoCancel.che si presenteranno in questa forma rispettivamente :

Intanto notiamo che nella prima, la X di chiusura è disabilitata : si può uscire solo con un Si o con un No. Nella seconda invece la X è abilitata : infatti il pulsante Annulla, corrisponde alla chiusura della finestra (e quindi alla X) SENZA avere optato né Si né No.
La prima la useremo per inserire nell'esecuzione del codice, una scelta operativa: a secondo del pulsante che l'utente sceglierà, compileremo le istruzioni necessarie : per una o due opzioni. Perchè una o due opzioni se già con un pulsante rispondiamo praticamente a due diverse condizioni; in questo esempio, rispondendo Si, otteniamo un risultato, rispondendo No, otteniamo di non modificare il risultato, per cui restano comunque due alternative:

  • Sub Prova1()
    pippo = MsgBox("ciao! Vuoi proseguire ?", vbYesNo)
    If pippo = vbYes Then
    MsgBox "Pippo"
    End Sub


L'effetto di questa istruzione sarà: se rispondi Si, appare un messaggio, in caso contrario non succede niente. é implicito nel tipo di domanda (Si/No) avere No se Non si risponde Si e quindi non occorre definire un istruzione per il caso No. Diverso è il seguente esempio, nel quale se Non si risponde Si , avendo No come alternativa, vorremo sfruttare questa condizione per impostare una seconda istruzione :

  • Sub Prova2()
    pippo = MsgBox("ciao! Vuoi proseguire ?", vbYesNo)
    If pippo = vbYes Then
    MsgBox "Pippo"
    Else

    MsgBox "Ciao !!!"

    End Sub

In questo caso, se si risponde Si, appare il messaggio "Pippo", se Non si risponde Si, appare "Ciao !!!" (si sfrutta il No di vbYesNo con Else)

Diversa è la finestra che otteniamo con vbYesNoCancel, nella quale, in un'istruzione come Prova2, il pulsante Annulla ci consentirebbe di uscire senza avere scelto né Si né No. E' possibile comunque sfruttare anche il pulsante Annulla ( o la X di chiusura), per ottenere una terza possibile azione, diversa dalla chiusura, che obbligherà una terza alternativa. Questo è un esempio:

  • Sub Prova3()
    pippo = MsgBox("ciao! Vuoi proseguire ?", vbYesNoCancel)
    If pippo = vbYes Then
    MsgBox "Pippo"
    ElseIf pippo = vbCancel Then
    MsgBox "Urca !!!"
    Else
    MsgBox "Ciao !!!"
    End If
    End Sub

Come si vede, vengono sfruttati tutti e tre i pulsanti, per ottenere tre alternative obbligate, escludendo un uscita senza scelte.

Una variante alla Sub Prova3() utillizza al posto del costrutto if......Elseif.....Else....End if  il  Select Case, così:

  • Sub Prova4()
    Dim iRisposta As Integer
    iRisposta = MsgBox("STAI PER USCIRE, VUOI SALVARE IL FILE ???", vbYesNoCancel)
    Select Case iRisposta 
    'impostiamo il Select Case con riferimento al messaggio restituito dalla variabile iRisposta
    Case vbYes              
     'se risponderemo "Si" :
          ThisWorkbook.Save        '
    salveremo il file e
          Application.Quit              '
    chiuderemo cartella ed Excel
    Case vbCancel           
    'se sceglieremo "Annulla":
          Exit Sub            
               'usciremo dalla routine
    Case vbNo                  '
    se sceglieremo "No":
         Application.Quit               '
    chiuderemo cartella ed Excel senza salvare
    Case Else
    End Select
    End Sub

Questa sotto invece è una diversa sintassi che usa il vbYesNo, ma che imposta come valore predefinito vbNo per NON compiere una azione. L'istruzione dice: col messaggio "Sicuro ecc..", se rispondi Si, avviene l'azione prevista da Cancel (Cancel = True), altrimenti Non avviene detta azione (Cancel = False)

Cancel = (MsgBox("Sicuro di voler chiudere la finestra ?", vbYesNo) = vbNo)

Se non avessimo usato questo tipo di istruzione, ma quella impostata nell'esempio Prova1, il VbNo non sarebbe stato definito e l'azione Cancel sarebbe equivalsa ad un Si.: lasciando invariata l'istruzione avremmo concesso a Cancel la sua funzione che è quella di Chiudere.