Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Convalida dell'input dell'utente | Interazione con l'Utente
Excel VBA per l'Automazione Aziendale

Convalida dell'input dell'utente

Scorri per mostrare il menu

Il pulsante Salva del capitolo precedente scriverà senza problemi un Nome Azienda vuoto o un'email errata nella tabella Customers, perché nulla in cmdSave_Click controlla prima i dati. La validazione è il passaggio che si esegue prima del salvataggio — intercettando i problemi quando sono ancora facili da correggere, invece che dopo che sono diventati dati errati presenti in un foglio di lavoro.

Campi obbligatori

Il controllo più semplice: questa TextBox è ancora vuota?

If Trim(txtCompanyName.Value) = "" Then
    MsgBox "Company Name is required."
    txtCompanyName.SetFocus
    Exit Sub
End If

Trim è importante qui più di quanto sembri — un utente che digita solo alcuni spazi e nient'altro supererebbe un semplice controllo = "", poiché " " tecnicamente non è una stringa vuota, ma è comunque inutilizzabile come il vero vuoto. SetFocus sposta il cursore lampeggiante direttamente nel controllo interessato, così l'utente non deve cercare quale campo deve essere corretto — un piccolo dettaglio che rende un modulo sensibilmente più curato.

Validazione numerica

IsNumeric verifica se un valore può essere convertito in un numero, senza tentare effettivamente la conversione e rischiare un errore:

If Not IsNumeric(txtReorderLevel.Value) Then
    MsgBox "Reorder Level must be a number."
    txtReorderLevel.SetFocus
    Exit Sub
End If

Questo è il controllo che avrebbe intercettato "twenty" digitato in un campo numerico, proprio come mostrato nello screenshot sopra. Solo dopo che questo controllo è superato è sicuro scrivere codice come CInt(txtReorderLevel.Value) più avanti nella Sub — validare prima e convertire dopo significa che la conversione non potrà mai fallire inaspettatamente.

Validazione delle date

IsDate segue lo stesso principio, applicato alle date invece che ai numeri:

If Not IsDate(txtOrderDate.Value) Then
    MsgBox "Order Date must be a valid date."
    txtOrderDate.SetFocus
    Exit Sub
End If

Messaggi di errore che raccolgono tutti i problemi in una volta sola I tre controlli sopra eseguono sempre Exit Sub non appena trovano un problema — va bene per un modulo breve, ma è frustrante in uno più lungo, dove l'utente corregge un errore solo per trovarne subito un altro. Un approccio più raffinato costruisce un elenco di tutti i problemi prima di mostrare un unico messaggio combinato:

Esempio di validazione
Private Sub cmdSave_Click()
    Dim errors As String
 
    If Trim(txtCompanyName.Value) = "" Then
        errors = errors & "- Company Name is required" & vbNewLine
    End If
 
    If Not IsNumeric(txtReorderLevel.Value) Then
        errors = errors & "- Reorder Level must be a number" & vbNewLine
    End If
 
    If errors <> "" Then
        MsgBox "Please fix the following:" & vbNewLine & errors, _
            vbExclamation
        Exit Sub
    End If
 
    ' ... all checks passed, safe to save now
End Sub

Questa è la stessa tecnica di costruzione della stringa vista nella macro di avviso scorte del capitolo precedente — errors parte vuota, e ogni controllo non superato aggiunge una nuova riga invece di uscire subito. Solo dopo che tutti i controlli sono stati eseguiti la Sub verifica se errors è rimasta vuota o meno, permettendo così all'utente di vedere tutti i problemi in un'unica volta invece che doverli correggere uno alla volta con continui messaggi di errore.

Attività

  1. Riscrivere cmdSave_Click dal compito del capitolo precedente per costruire una stringa di errori, verificando che Company Name, Contact ed Email non siano vuoti.
  2. Aggiungere una quarta TextBox, txtReorderLevel, solo per questo esercizio, e validarla con IsNumeric.
  3. Mostrare un unico MsgBox che elenca tutti i problemi, utilizzando vbExclamation come icona, e procedere al codice ListRows.Add solo quando errors è vuoto.
  4. Testare lasciando tutti i campi vuoti e cliccando su Save — confermare che tutte le righe di errore previste compaiano in un unico messaggio.
Suggerimento
expand arrow

1. Costruzione di una stringa di errori

  • Dichiarare una variabile String (errors) all'inizio di cmdSave_Click, inizializzandola vuota.
  • Per ciascuno dei tre campi, utilizzare lo stesso controllo Trim(...) = "" dalla sezione 5.3 — se è vuoto, aggiungere una riga a errors invece di mostrare subito un MsgBox o uscire dalla Sub.
  • vbNewLine alla fine di ogni riga aggiunta mantiene ogni problema su una propria riga nel messaggio finale.

2. Aggiunta di txtReorderLevel

  • Questa è una TextBox solo per esercitarsi nella validazione numerica — non corrisponde a una colonna reale in tblCustomers, quindi non inserirla in newRow successivamente.
  • Aggiungerla al form in visualizzazione Design (Shift+F7) con un'etichetta corrispondente, come fatto per le altre tre TextBox.
  • IsNumeric controlla il testo grezzo in .Value — se fallisce, aggiungere una riga a errors come per i controlli sui campi vuoti.

3. Un unico MsgBox combinato, poi procedere

  • Tutto quanto illustrato nell'esempio pratico della sezione 5.3 si applica direttamente qui — controllare If errors <> "" Then, mostrare un unico MsgBox con vbExclamation ed eseguire Exit Sub.
  • Il codice ListRows.Add viene eseguito solo se quel blocco If non esce — quindi deve trovarsi fisicamente dopo tutto il blocco di validazione, non all'interno di un Else.

4. Test con tutti i campi vuoti

  • Cliccare su Save senza digitare nulla.
  • Si dovrebbe vedere esattamente un MsgBox, che elenca tutti e quattro i problemi (Company Name, Contact, Email, Reorder Level) invece di fermarsi al primo — questo unico messaggio combinato è il vero obiettivo dell'esercizio, rispetto alla versione precedente che usciva dopo il primo controllo fallito.
Soluzione
expand arrow
Private Sub cmdSave_Click()
    Dim tbl As ListObject
    Dim newRow As ListRow
    Dim errors As String

    ' --- Validation ---
    If Trim(txtCompanyName.Value) = "" Then
        errors = errors & "- Company Name is required" & vbNewLine
    End If

    If Trim(txtContact.Value) = "" Then
        errors = errors & "- Contact is required" & vbNewLine
    End If

    If Trim(txtEmail.Value) = "" Then
        errors = errors & "- Email is required" & vbNewLine
    End If

    If Not IsNumeric(txtReorderLevel.Value) Then
        errors = errors & "- Reorder Level must be a number" & vbNewLine
    End If

    If errors <> "" Then
        MsgBox "Please fix the following:" & vbNewLine & errors, vbExclamation
        Exit Sub
    End If

    ' --- All checks passed — safe to save now ---
    Set tbl = ThisWorkbook.Worksheets("Customers").ListObjects("tblCustomers")
    Set newRow = tbl.ListRows.Add

    newRow.Range(1, 1).Value = "C0" & (tbl.ListRows.Count + 100)
    newRow.Range(1, 2).Value = txtCompanyName.Value
    newRow.Range(1, 3).Value = txtContact.Value
    newRow.Range(1, 4).Value = txtEmail.Value
    newRow.Range(1, 5).Value = cboCity.Value
    newRow.Range(1, 6).Value = cboStatus.Value

    MsgBox txtCompanyName.Value & " was added successfully."
    Unload Me
End Sub

Eseguire il form, lasciare tutti i campi vuoti e cliccare su Save — si dovrebbe vedere un unico MsgBox con un'icona di avviso che elenca tutti e quattro i campi mancanti/non validi contemporaneamente, e nessuna riga aggiunta a tblCustomers finché non si compilano correttamente tutti i campi.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 5. Capitolo 3

Chieda ad AI

expand

Chieda ad AI

ChatGPT

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

Sezione 5. Capitolo 3
some-alt