Validando la entrada del usuario
Desliza para mostrar el menú
El botón Guardar del capítulo anterior escribirá sin problemas un Nombre de Empresa en blanco o un correo electrónico incorrecto en la tabla Customers, porque nada en cmdSave_Click verifica los datos primero. La validación es el paso que se ejecuta antes de guardar: detecta problemas mientras aún son fáciles de corregir, en lugar de después, cuando ya se han convertido en datos incorrectos en una hoja de cálculo.
Campos obligatorios
La comprobación más simple: ¿este TextBox sigue vacío?
If Trim(txtCompanyName.Value) = "" Then
MsgBox "Company Name is required."
txtCompanyName.SetFocus
Exit Sub
End If
Trim es importante aquí más de lo que parece: un usuario que escriba solo algunos espacios y nada más pasaría una comprobación simple = "", ya que " " técnicamente no es una cadena vacía, pero es tan inutilizable como el vacío real. SetFocus mueve el cursor parpadeante directamente al control problemático, para que el usuario no tenga que buscar qué campo necesita corregir; un pequeño detalle que hace que un formulario se sienta mucho más pulido.
Validación numérica
IsNumeric verifica si un valor podría convertirse en un número, sin intentar realmente la conversión y arriesgarse a un error:
If Not IsNumeric(txtReorderLevel.Value) Then
MsgBox "Reorder Level must be a number."
txtReorderLevel.SetFocus
Exit Sub
End If
Esta es la comprobación que habría detectado "twenty" escrito en un campo numérico, exactamente como se muestra en la captura de pantalla anterior. Solo después de que esta comprobación pasa es seguro escribir código como CInt(txtReorderLevel.Value) más adelante en el Sub; validar primero y convertir después significa que la conversión nunca fallará inesperadamente.
Validación de fechas
IsDate es la misma idea, aplicada a fechas en lugar de números:
If Not IsDate(txtOrderDate.Value) Then
MsgBox "Order Date must be a valid date."
txtOrderDate.SetFocus
Exit Sub
End If
Mensajes de error que recopilan todos los problemas a la vez
Las tres comprobaciones anteriores todas hacen Exit Sub en cuanto encuentran un problema: está bien para un formulario corto, pero resulta frustrante en uno más largo, donde el usuario corrige un error solo para encontrarse inmediatamente con el siguiente. Un patrón más pulido acumula una lista de todos los problemas antes de mostrar un solo mensaje combinado:
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
Esta es la misma técnica de construcción de cadenas del macro de alerta de stock del capítulo anterior: errors comienza vacío, y cada comprobación fallida agrega una línea más en lugar de salir inmediatamente. Solo después de que todas las comprobaciones se han ejecutado, el Sub verifica si errors terminó vacío o no, lo que permite al usuario ver todos los problemas de su entrada en una sola pasada en lugar de una frustrante ida y vuelta por cada error.
Tarea
- Reescribir
cmdSave_Clickdel ejercicio del capítulo anterior para construir una cadena de errores, comprobando que Company Name, Contact y Email no estén en blanco. - Agregar una cuarta TextBox, txtReorderLevel, solo para este ejercicio, y validarla con IsNumeric.
- Mostrar un único MsgBox combinando todos los problemas, usando vbExclamation como icono, y solo continuar con el código de ListRows.Add si la variable errors está vacía.
- Probar dejando todos los campos en blanco y haciendo clic en Save — confirmar que todas las líneas de error esperadas aparecen en un solo mensaje.
1. Construcción de una cadena de errores
- Declarar una variable
String(errors) al inicio decmdSave_Click, comenzando vacía. - Para cada uno de los tres campos, usar la misma comprobación
Trim(...) = ""de la sección 5.3 — si está en blanco, agregar una línea aerrorsen lugar de mostrar unMsgBoxinmediatamente o salir del Sub. vbNewLineal final de cada línea agregada mantiene cada problema en su propia línea en el mensaje final.
2. Agregar txtReorderLevel
- Esta es una TextBox solo para practicar la validación numérica — no corresponde a una columna real en
tblCustomers, así que no intentes escribirla ennewRowdespués. - Agrégala al formulario en la vista de diseño (Shift+F7) con una etiqueta correspondiente, de la misma manera que agregaste las otras tres TextBoxes.
IsNumericverifica el texto sin procesar en.Value— si falla, agrega una línea aerrorsigual que en las comprobaciones de campos en blanco.
3. Un único MsgBox combinado, luego continuar
- Todo lo del ejemplo trabajado de la sección 5.3 aplica directamente aquí — verifica
If errors <> "" Then, muestra un soloMsgBoxconvbExclamationyExit Sub. - El código de
ListRows.Addsolo se ejecuta si ese bloqueIfno sale — lo que significa que debe estar físicamente después de todo el bloque de validación, no dentro de unElse.
4. Prueba dejando todo en blanco
- Haz clic en Save sin escribir nada.
- Deberías ver exactamente un
MsgBox, que enumera los cuatro problemas (Company Name, Contact, Email, Reorder Level) en lugar de detenerse después del primero — ese mensaje combinado es el objetivo real de este ejercicio, en comparación con la versión anterior que salía después de la primera comprobación fallida.
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
Ejecuta el formulario, deja todos los campos en blanco y haz clic en Save — deberías ver un solo MsgBox con un icono de advertencia que enumera los cuatro campos faltantes/no válidos a la vez, y no se agregará ninguna fila a tblCustomers hasta que completes todo correctamente.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla