Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Validando la entrada del usuario | Interacción con el Usuario
Excel VBA para Automatización Empresarial

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:

Ejemplo de validación
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

  1. Reescribir cmdSave_Click del ejercicio del capítulo anterior para construir una cadena de errores, comprobando que Company Name, Contact y Email no estén en blanco.
  2. Agregar una cuarta TextBox, txtReorderLevel, solo para este ejercicio, y validarla con IsNumeric.
  3. 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.
  4. 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.
Pista
expand arrow

1. Construcción de una cadena de errores

  • Declarar una variable String (errors) al inicio de cmdSave_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 a errors en lugar de mostrar un MsgBox inmediatamente o salir del Sub.
  • vbNewLine al 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 en newRow despué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.
  • IsNumeric verifica el texto sin procesar en .Value — si falla, agrega una línea a errors igual 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 solo MsgBox con vbExclamation y Exit Sub.
  • El código de ListRows.Add solo se ejecuta si ese bloque If no sale — lo que significa que debe estar físicamente después de todo el bloque de validación, no dentro de un Else.

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.
Solución
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

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.

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 5. Capítulo 3

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Sección 5. Capítulo 3
some-alt