TOP

VBA-Lezione 10. Finestre di dialogo (Finestre di dialogo)

YouLibreCalc for Excel logo

Le finestre di dialogo (finestre di dialogo) in Excel VBA vengono utilizzate per visualizzare le informazioni all'utente.

La funzione MsgBox visualizza un messaggio in una finestra di dialogo e attende che l'utente faccia clic su un pulsante, quindi restituisce un numero intero che indica su quale pulsante l'utente ha fatto clic.

La finestra di dialogo più comune è la Message Box, ma possiamo anche utilizzare la Input Box.


MsgBox

Finora abbiamo utilizzato la finestra di dialogo MsgBox per visualizzare le informazioni sullo schermo.

Sub delete_B2()
    Range("B2").ClearContents
    MsgBox "The contents of B2 have been deleted !"  '"Il contenuto della cella B2 è stato cancellato!"
End Sub

In questo caso MsgBox viene chiamato con un solo argomento. Vedere codice qui sotto:

Ora creeremo una finestra di dialogo che chiederà conferma per l'eliminazione prima che le due istruzioni vengano eseguite. Quindi ci sono tre argomenti che useremo:

MsgBox([TEXT], [BUTTONS], [TITLE])
  • TEXT: testo della finestra di dialogo
  • BUTTONS: selezione dei pulsanti (sì, no, annulla, ecc.) + altre opzioni
  • TITLE: titolo della finestra di dialogo
  • Sub delete_B2()
    
        If MsgBox("Are you sure that you wish to delete the contents of B2 ?", vbYesNo, "Confirm") = vbYes
        Then
          Range("B2").ClearContents
          MsgBox "The contents of B2 have been deleted !"
        End If
        
    End Sub
    

    Risultato:

    Private Sub warning(var_text As String)
        MsgBox "Caution : " & var_text & " !"
    End Sub
    
    Sub macro_test()
        If Range("A1") = "" Then
            warning "empty cell"           '"cella vuota"
        ElseIf Not IsNumeric(Range("A1")) Then
            warning "non-numerical value"  '"valore non numerico"
        End If
    End Sub
    

    vbYesNo specifica che i pulsanti di dialogo sono "Yes" e "No" e vbYes rappresenta il pulsante "Yes":

    If MsgBox("Text", vbYesNo, "Title") = vbYes Then 'Se viene premuto il pulsante Yes...
    

    Opzioni per utilizzare il secondo argomento in MsgBox

    Costante Valore numerico Descrizione
    vbOKOnly0ok - dialog boxes
    vbOKCancel1ok - dialog boxescancel - dialog boxes
    vbAbortRetryIgnore2abort - dialog boxesretry - dialog boxesignore - dialog boxes
    vbYesNoCancel3yes - dialog boxesno - dialog boxescancel - dialog boxes
    vbYesNo4yes - dialog boxesno - dialog boxes
    vbRetryCancel5retry - dialog boxescancel - dialog boxes
    vbCritical16critical - dialog boxes
    vbQuestion32question - dialog boxes
    vbExclamation48exclamation - dialog boxes
    vbInformation64information - dialog boxes

    Esempio di utilizzo del secondo argomento in MsgBox

    Ecco un esempio MsgBox che continuerà a essere visualizzato ogni volta nel ciclo finché l'utente non preme Yes:

    Sub humor()
        Do
            If MsgBox("Do you like the Moonexcel site ?", vbYesNo, "Survey") = vbYes Then
                Exit Do '=> Risposta Yes = Sì, usciamo dal ciclo
            End If
        Loop While 1 = 1 '=> Ciclo infinito
        MsgBox ";-)"
    End Sub
    

    Per visualizzare una nuova barra multifunzione, è possibile utilizzare la funzione Chr con argomento 10, che è responsabile dello spostamento della barra multifunzione, ad esempio:

    MsgBox "Example 1" & Chr(10) & "Example 2" & Chr(10) & Chr(10) & "Example 3"
    

    Otteniamo il seguente risultato:

    InputBox

    Un InputBox richiede all'utente di inserire un valore in una finestra di dialogo, ad esempio:

    Sub example()
        Dim result As String
       
        result = InputBox("Text ?", "Title") 'Alla variabile viene assegnato il valore immesso nell'InputBox
       
        If result <> "" Then 'Se il valore è diverso da "", verrà visualizzato il risultato
           MsgBox result
        End If
    End Sub
    

    Otteniamo il seguente risultato:

    Il terzo argomento può essere utilizzato per impostare il valore predefinito:

    InputBox("Text ?", "Title", "Default value")
    

    Il risultato è il seguente: