certmundo.
es‑mx

7 min de lectura

¿Cómo crear formularios de usuario (UserForms) en VBA?

Un UserForm es una ventana personalizada que tú diseñas en VBA para capturar datos de forma ordenada y validada, sin que el usuario toque directamente las celdas.

Qué es un UserForm y para qué sirve

Un UserForm es un formulario visual que aparece sobre Excel. Contiene controles como botones, cuadros de texto y listas desplegables. Con él puedes guiar al usuario paso a paso y evitar errores de captura.

Un caso real: el equipo de ventas de una distribuidora de FEMSA necesita registrar pedidos diarios. Con un UserForm, el capturista llena un formulario, hace clic en "Guardar" y los datos van directo a la hoja, sin errores de formato ni celdas en blanco.

Cómo insertar un UserForm en el Editor de VBA

Sigue estos pasos exactos:

  1. Abre Excel y presiona Alt + F11 para abrir el Editor de VBA.
  2. En el menú, elige Insertar → UserForm.
  3. Aparece un lienzo en blanco y el Cuadro de herramientas (Toolbox).
  4. Desde el Toolbox, arrastra los controles al lienzo.

Si el Toolbox no aparece, ve a Ver → Cuadro de herramientas.

Controles esenciales del Toolbox

Control Nombre en VBA Uso típico
Cuadro de texto TextBox Capturar nombre, cantidad, precio
Etiqueta Label Mostrar texto fijo ("Nombre del cliente:")
Botón de comando CommandButton Ejecutar acciones (Guardar, Cancelar)
Lista desplegable ComboBox Elegir producto, estado, sucursal
Casilla de verificación CheckBox Opciones sí/no (entrega a domicilio)
Marco Frame Agrupar controles relacionados

Cada control tiene una propiedad Name que usarás en el código. Cambia los nombres desde la ventana Propiedades (F4) para que sean descriptivos.

Diseñar el formulario de captura de pedidos

Vamos a construir un formulario para registrar pedidos. Tendrá estos controles:

  • lblCliente → Label: "Cliente:"
  • txtCliente → TextBox: nombre del cliente
  • lblProducto → Label: "Producto:"
  • cboProducto → ComboBox: lista de productos
  • lblCantidad → Label: "Cantidad:"
  • txtCantidad → TextBox: número de unidades
  • lblPrecio → Label: "Precio unitario ($):"
  • txtPrecio → TextBox: precio
  • btnGuardar → CommandButton: texto "Guardar"
  • btnCancelar → CommandButton: texto "Cancelar"

Cambia la propiedad Caption del UserForm a "Captura de Pedido" en la ventana de Propiedades.

Programar el evento Initialize

El evento UserForm_Initialize se ejecuta justo antes de que el formulario aparezca. Úsalo para cargar la lista de productos en el ComboBox.

Haz doble clic en el lienzo del UserForm para abrir su módulo de código. Escribe:

Private Sub UserForm_Initialize()
    ' Cargar productos en el ComboBox
    With cboProducto
        .AddItem "Sabritas Original"
        .AddItem "Coca-Cola 600ml"
        .AddItem "Bimbo Pan Blanco"
        .AddItem "Agua Ciel 1L"
        .AddItem "Gansito Marinela"
    End With

    ' Valor por defecto en cantidad
    txtCantidad.Value = "1"
End Sub

Con AddItem agregas cada opción al ComboBox. Puedes también leer los productos desde un rango de celdas para que la lista sea dinámica.

Programar el botón Guardar

Haz doble clic en el botón btnGuardar. Se crea automáticamente el evento btnGuardar_Click. Escribe el siguiente código:

Private Sub btnGuardar_Click()
    Dim ws As Worksheet
    Dim ultimaFila As Long
    Dim cliente As String
    Dim producto As String
    Dim cantidad As Long
    Dim precio As Double
    Dim total As Double

    ' Validar que los campos no estén vacíos
    If txtCliente.Value = "" Then
        MsgBox "Escribe el nombre del cliente.", vbExclamation
        txtCliente.SetFocus
        Exit Sub
    End If

    If cboProducto.Value = "" Then
        MsgBox "Selecciona un producto.", vbExclamation
        cboProducto.SetFocus
        Exit Sub
    End If

    If Not IsNumeric(txtCantidad.Value) Or CLng(txtCantidad.Value) < 1 Then
        MsgBox "La cantidad debe ser un número mayor a cero.", vbExclamation
        txtCantidad.SetFocus
        Exit Sub
    End If

    If Not IsNumeric(txtPrecio.Value) Or CDbl(txtPrecio.Value) <= 0 Then
        MsgBox "El precio debe ser un número mayor a cero.", vbExclamation
        txtPrecio.SetFocus
        Exit Sub
    End If

    ' Asignar valores a variables
    Set ws = ThisWorkbook.Sheets("Pedidos")
    cliente = txtCliente.Value
    producto = cboProducto.Value
    cantidad = CLng(txtCantidad.Value)
    precio = CDbl(txtPrecio.Value)
    total = cantidad * precio

    ' Encontrar la siguiente fila vacía
    ultimaFila = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1

    ' Escribir datos en la hoja
    ws.Cells(ultimaFila, 1).Value = Now()
    ws.Cells(ultimaFila, 2).Value = cliente
    ws.Cells(ultimaFila, 3).Value = producto
    ws.Cells(ultimaFila, 4).Value = cantidad
    ws.Cells(ultimaFila, 5).Value = precio
    ws.Cells(ultimaFila, 6).Value = total

    MsgBox "Pedido guardado correctamente.", vbInformation

    ' Limpiar campos para el siguiente registro
    txtCliente.Value = ""
    cboProducto.Value = ""
    txtCantidad.Value = "1"
    txtPrecio.Value = ""
    txtCliente.SetFocus
End Sub

Este código valida cada campo antes de escribir. Si algo falta, avisa al usuario y mueve el cursor al campo correcto con SetFocus.

Programar el botón Cancelar

El botón Cancelar debe cerrar el formulario sin guardar nada.

Private Sub btnCancelar_Click()
    Unload Me
End Sub

Unload Me cierra y destruye el formulario de la memoria. Si solo quieres ocultarlo temporalmente usa Me.Hide.

Cómo mostrar el formulario desde una macro

Crea una macro en un módulo estándar para abrir el formulario:

Sub AbrirFormularioPedidos()
    frmPedidos.Show
End Sub

Asegúrate de que el nombre del UserForm en Propiedades sea frmPedidos. Después asigna esta macro a un botón en tu hoja de Excel para que cualquier usuario lo pueda abrir con un clic.

Cargar la lista de productos desde un rango de celdas

En lugar de escribir los productos a mano en el código, puedes leerlos desde la hoja:

Private Sub UserForm_Initialize()
    Dim ws As Worksheet
    Dim i As Long
    Dim totalProductos As Long

    Set ws = ThisWorkbook.Sheets("Catalogo")
    totalProductos = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To totalProductos
        cboProducto.AddItem ws.Cells(i, 1).Value
    Next i

    txtCantidad.Value = "1"
End Sub

Así, si el catálogo de FEMSA o Liverpool cambia, solo actualizas la hoja "Catalogo" y el formulario lo refleja automáticamente.

Errores comunes

Error 1: Usar el nombre por defecto de los controles. Si dejas TextBox1, TextBox2, ComboBox1, el código se vuelve difícil de leer y mantener. Cambia siempre el nombre en Propiedades antes de escribir código.

Error 2: No validar los campos antes de guardar. Si el usuario deja el precio en blanco y el código intenta hacer CDbl(""), obtendrás un error de tipo. Siempre usa If ... = "" e IsNumeric() antes de operar con los valores.

Error 3: Usar Me.Hide cuando deberías usar Unload Me. Me.Hide solo oculta el formulario, pero sigue en memoria con los datos anteriores. Si vuelve a abrirse, mostrará los datos viejos. Usa Unload Me para reiniciar el formulario completamente.

Error 4: Olvidar que la hoja de destino debe existir. Si el código hace referencia a Sheets("Pedidos") y esa hoja no existe, VBA lanza el error 9 (subíndice fuera de rango). Verifica el nombre exacto de la hoja, incluyendo mayúsculas y espacios.

Propiedades clave de los controles

Propiedad Control Efecto
Value TextBox, ComboBox Lee o escribe el contenido actual
Caption Label, CommandButton Texto visible en pantalla
Enabled Cualquiera False desactiva el control (gris)
Visible Cualquiera False oculta el control
SetFocus Cualquiera Mueve el cursor a ese control
BackColor TextBox, Frame Cambia el color de fondo
MaxLength TextBox Limita la cantidad de caracteres

Resumen rápido del flujo de trabajo

  1. Insertar el UserForm desde el Editor de VBA.
  2. Agregar controles desde el Toolbox y renombrarlos.
  3. Programar UserForm_Initialize para cargar datos iniciales.
  4. Programar el botón Guardar con validaciones y escritura en hoja.
  5. Programar el botón Cancelar con Unload Me.
  6. Crear una macro en módulo estándar para mostrar el formulario con frmPedidos.Show.
  7. Asignar esa macro a un botón en la hoja de Excel.

Puntos clave

  • Inserta un UserForm desde **Insertar → UserForm** en el Editor de VBA; luego arrastra controles del Toolbox y renómbralos en la ventana Propiedades antes de escribir cualquier código.
  • Usa el evento `UserForm_Initialize` para cargar listas en ComboBox y establecer valores por defecto; así el formulario siempre arranca en un estado limpio y consistente.
  • Valida todos los campos con `If ... = ""` e `IsNumeric()` dentro del evento `_Click` del botón Guardar antes de escribir datos en la hoja; esto evita errores de tipo y registros incompletos.
  • Usa `Unload Me` para cerrar y destruir el formulario completamente; reserva `Me.Hide` solo cuando necesitas ocultar el formulario sin perder los datos que ya capturó.
  • Muestra el formulario desde una macro en módulo estándar con `frmPedidos.Show` y asígnala a un botón en la hoja para que cualquier usuario pueda acceder a él sin abrir el Editor de VBA.

Comparte esta lección:

¿Cómo crear formularios de usuario (UserForms) en VBA? | Macros y VBA en Excel: Curso Avanzado | Certmundo