Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Finestre di messaggio e finestre di input | Interazione con l'Utente
Excel VBA per l'Automazione Aziendale

Finestre di messaggio e finestre di input

Scorri per mostrare il menu

Prima di creare un modulo completo, è utile padroneggiare i due modi più semplici con cui VBA può interagire con l'utente: MsgBox, che mostra informazioni e opzionalmente pone una domanda, e InputBox, che richiede una breve risposta testuale.

MsgBox

Nella sua forma più semplice, MsgBox visualizza semplicemente un messaggio e attende che l'utente faccia clic su OK:

MsgBox "Customer saved successfully."

Utilizzato in questo modo — come istruzione, senza parentesi e senza acquisire alcun risultato — MsgBox rappresenta un punto morto: mostra il messaggio e il codice prosegue, indipendentemente da ciò che fa l'utente. Nel momento in cui è necessario sapere quale pulsante è stato premuto, MsgBox diventa una funzione invece che un'istruzione, il che significa che necessita di parentesi e di una variabile per memorizzare il risultato:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Figura 5.1

vbYesNo e vbQuestion vengono sommati con un semplice +, che può sembrare insolito la prima volta che lo si vede ma rappresenta semplicemente il modo in cui VBA consente di combinare due impostazioni indipendenti — quali pulsanti visualizzare e quale icona mostrare — nell'unico secondo argomento che MsgBox si aspetta. Il risultato viene restituito come una delle costanti predefinite di VBA, vbYes o vbNo, che in realtà sono solo numeri mascherati (6 e 7, anche se non si scriverebbe mai il numero letterale). Per eseguire un'azione in base alla risposta, si utilizza un semplice If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Mentre MsgBox restituisce solo un insieme fisso di costanti di pulsante, InputBox chiede all'utente di digitare qualcosa e restituisce ciò che è stato inserito:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Figura 5.2

Il terzo argomento, qui "Chicago", precompila la casella di testo — utile per suggerire una risposta probabile che l'utente può accettare o sovrascrivere. Due dettagli sono facili da sbagliare la prima volta: qualsiasi cosa l'utente digiti viene restituita come String, indipendentemente dall'aspetto, quindi digitando 25 si ottiene il testo "25", non il numero 25, e sarà necessario utilizzare CInt o CDbl prima di eseguire operazioni aritmetiche; inoltre, cliccando su Cancel non viene generato un errore né viene interrotto il codice — viene semplicemente restituita una stringa vuota (""), che il codice deve controllare esplicitamente se una risposta vuota non è valida.

Prompt e Conferme Utente

La combinazione dei due rappresenta lo schema standard per qualsiasi azione che legge l'input dell'utente e poi necessita di una conferma prima di eseguire un'operazione rischiosa:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Si noti che confirmMsg è dichiarato As VbMsgBoxResult invece che come tipo generico — questo è il tipo nominato effettivo che VBA utilizza per il valore restituito da MsgBox, e dichiararlo esplicitamente (anziché lasciarlo come Variant) permette al VBE di offrire il completamento automatico per vbYes, vbNo e gli altri mentre si digita. Il controllo della stringa vuota dopo InputBox e il controllo di vbNo dopo MsgBox utilizzano entrambi lo stesso schema di uscita, Exit Sub, che interrompe immediatamente la procedura invece di lasciare che prosegua in codice che presuppone l'esistenza di un input valido.

Attività

  1. Scrivere una Sub che utilizza InputBox per richiedere un Customer ID, quindi MsgBox per confermare "Eliminare il cliente [ID]?" con pulsanti Sì/No e un'icona domanda.
  2. Gestire sia il caso della stringa vuota (utente ha cliccato Annulla su InputBox) sia il caso vbNo (utente ha rifiutato la conferma) uscendo anticipatamente dalla Sub con un messaggio che spiega che non è successo nulla.
  3. Solo quando entrambi i controlli sono superati, mostrare una MsgBox finale con il testo "Il cliente verrebbe eliminato qui."
Suggerimento
expand arrow

1. Ottenere il Customer ID e costruire la conferma

  • InputBox richiede un prompt e può accettare un titolo come secondo argomento — memorizzare ciò che viene restituito in una variabile di tipo String.
  • Il messaggio di conferma deve concatenare l'ID reale utilizzando &, non scrivere una stringa fissa — altrimenti direbbe sempre letteralmente "[ID]".
  • MsgBox usato come funzione (per catturare un risultato) richiede le parentesi; combinare vbYesNo e vbQuestion con +.

2. Gestione di Annulla e No

  • Controllare il caso della stringa vuota subito dopo la riga di InputBox, prima ancora di costruire il messaggio di conferma — non ha senso chiedere "Eliminare il cliente?" se non c'è un ID da eliminare.
  • Exit Sub interrompe immediatamente la procedura ovunque sia posizionato — usarlo direttamente all'interno di ciascun blocco If, con una MsgBox subito prima che spiega che non è successo nulla.
  • Il controllo su vbNo viene dopo la MsgBox di conferma, confrontando il risultato catturato con la costante vbNo.

3. La conferma finale

  • Questa riga viene eseguita solo se l'esecuzione la raggiunge — poiché entrambi i controlli precedenti eseguono Exit Sub in caso di errore, posizionare semplicemente questa MsgBox dopo entrambi i controlli garantisce che venga eseguita solo se entrambi sono superati.
Soluzione
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Eseguire (F5) e provare tutti e tre i percorsi: cliccare Annulla su InputBox, cliccare No sulla conferma e infine inserire un ID e cliccare Sì — ognuno dovrebbe produrre uno dei tre messaggi diversi.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 1

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Finestre di messaggio e finestre di input

Prima di creare un modulo completo, è utile padroneggiare i due modi più semplici con cui VBA può interagire con l'utente: MsgBox, che mostra informazioni e opzionalmente pone una domanda, e InputBox, che richiede una breve risposta testuale.

MsgBox

Nella sua forma più semplice, MsgBox visualizza semplicemente un messaggio e attende che l'utente faccia clic su OK:

MsgBox "Customer saved successfully."

Utilizzato in questo modo — come istruzione, senza parentesi e senza acquisire alcun risultato — MsgBox rappresenta un punto morto: mostra il messaggio e il codice prosegue, indipendentemente da ciò che fa l'utente. Nel momento in cui è necessario sapere quale pulsante è stato premuto, MsgBox diventa una funzione invece che un'istruzione, il che significa che necessita di parentesi e di una variabile per memorizzare il risultato:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
Figura 5.1

vbYesNo e vbQuestion vengono sommati con un semplice +, che può sembrare insolito la prima volta che lo si vede ma rappresenta semplicemente il modo in cui VBA consente di combinare due impostazioni indipendenti — quali pulsanti visualizzare e quale icona mostrare — nell'unico secondo argomento che MsgBox si aspetta. Il risultato viene restituito come una delle costanti predefinite di VBA, vbYes o vbNo, che in realtà sono solo numeri mascherati (6 e 7, anche se non si scriverebbe mai il numero letterale). Per eseguire un'azione in base alla risposta, si utilizza un semplice If:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

Mentre MsgBox restituisce solo un insieme fisso di costanti di pulsante, InputBox chiede all'utente di digitare qualcosa e restituisce ciò che è stato inserito:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
Figura 5.2

Il terzo argomento, qui "Chicago", precompila la casella di testo — utile per suggerire una risposta probabile che l'utente può accettare o sovrascrivere. Due dettagli sono facili da sbagliare la prima volta: qualsiasi cosa l'utente digiti viene restituita come String, indipendentemente dall'aspetto, quindi digitando 25 si ottiene il testo "25", non il numero 25, e sarà necessario utilizzare CInt o CDbl prima di eseguire operazioni aritmetiche; inoltre, cliccando su Cancel non viene generato un errore né viene interrotto il codice — viene semplicemente restituita una stringa vuota (""), che il codice deve controllare esplicitamente se una risposta vuota non è valida.

Prompt e Conferme Utente

La combinazione dei due rappresenta lo schema standard per qualsiasi azione che legge l'input dell'utente e poi necessita di una conferma prima di eseguire un'operazione rischiosa:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

Si noti che confirmMsg è dichiarato As VbMsgBoxResult invece che come tipo generico — questo è il tipo nominato effettivo che VBA utilizza per il valore restituito da MsgBox, e dichiararlo esplicitamente (anziché lasciarlo come Variant) permette al VBE di offrire il completamento automatico per vbYes, vbNo e gli altri mentre si digita. Il controllo della stringa vuota dopo InputBox e il controllo di vbNo dopo MsgBox utilizzano entrambi lo stesso schema di uscita, Exit Sub, che interrompe immediatamente la procedura invece di lasciare che prosegua in codice che presuppone l'esistenza di un input valido.

Attività

  1. Scrivere una Sub che utilizza InputBox per richiedere un Customer ID, quindi MsgBox per confermare "Eliminare il cliente [ID]?" con pulsanti Sì/No e un'icona domanda.
  2. Gestire sia il caso della stringa vuota (utente ha cliccato Annulla su InputBox) sia il caso vbNo (utente ha rifiutato la conferma) uscendo anticipatamente dalla Sub con un messaggio che spiega che non è successo nulla.
  3. Solo quando entrambi i controlli sono superati, mostrare una MsgBox finale con il testo "Il cliente verrebbe eliminato qui."
Suggerimento
expand arrow

1. Ottenere il Customer ID e costruire la conferma

  • InputBox richiede un prompt e può accettare un titolo come secondo argomento — memorizzare ciò che viene restituito in una variabile di tipo String.
  • Il messaggio di conferma deve concatenare l'ID reale utilizzando &, non scrivere una stringa fissa — altrimenti direbbe sempre letteralmente "[ID]".
  • MsgBox usato come funzione (per catturare un risultato) richiede le parentesi; combinare vbYesNo e vbQuestion con +.

2. Gestione di Annulla e No

  • Controllare il caso della stringa vuota subito dopo la riga di InputBox, prima ancora di costruire il messaggio di conferma — non ha senso chiedere "Eliminare il cliente?" se non c'è un ID da eliminare.
  • Exit Sub interrompe immediatamente la procedura ovunque sia posizionato — usarlo direttamente all'interno di ciascun blocco If, con una MsgBox subito prima che spiega che non è successo nulla.
  • Il controllo su vbNo viene dopo la MsgBox di conferma, confrontando il risultato catturato con la costante vbNo.

3. La conferma finale

  • Questa riga viene eseguita solo se l'esecuzione la raggiunge — poiché entrambi i controlli precedenti eseguono Exit Sub in caso di errore, posizionare semplicemente questa MsgBox dopo entrambi i controlli garantisce che venga eseguita solo se entrambi sono superati.
Soluzione
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

Eseguire (F5) e provare tutti e tre i percorsi: cliccare Annulla su InputBox, cliccare No sulla conferma e infine inserire un ID e cliccare Sì — ognuno dovrebbe produrre uno dei tre messaggi diversi.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 1
some-alt