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:
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à
- Riscrivere
cmdSave_Clickdal compito del capitolo precedente per costruire una stringa di errori, verificando che Company Name, Contact ed Email non siano vuoti. - Aggiungere una quarta TextBox, txtReorderLevel, solo per questo esercizio, e validarla con IsNumeric.
- Mostrare un unico MsgBox che elenca tutti i problemi, utilizzando vbExclamation come icona, e procedere al codice ListRows.Add solo quando errors è vuoto.
- Testare lasciando tutti i campi vuoti e cliccando su Save — confermare che tutte le righe di errore previste compaiano in un unico messaggio.
1. Costruzione di una stringa di errori
- Dichiarare una variabile
String(errors) all'inizio dicmdSave_Click, inizializzandola vuota. - Per ciascuno dei tre campi, utilizzare lo stesso controllo
Trim(...) = ""dalla sezione 5.3 — se è vuoto, aggiungere una riga aerrorsinvece di mostrare subito unMsgBoxo uscire dalla Sub. vbNewLinealla 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 innewRowsuccessivamente. - Aggiungerla al form in visualizzazione Design (Shift+F7) con un'etichetta corrispondente, come fatto per le altre tre TextBox.
IsNumericcontrolla il testo grezzo in.Value— se fallisce, aggiungere una riga aerrorscome 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 unicoMsgBoxconvbExclamationed eseguireExit Sub. - Il codice
ListRows.Addviene eseguito solo se quel bloccoIfnon esce — quindi deve trovarsi fisicamente dopo tutto il blocco di validazione, non all'interno di unElse.
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.
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.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione