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:
- Abre Excel y presiona Alt + F11 para abrir el Editor de VBA.
- En el menú, elige Insertar → UserForm.
- Aparece un lienzo en blanco y el Cuadro de herramientas (Toolbox).
- 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 clientelblProducto→ Label: "Producto:"cboProducto→ ComboBox: lista de productoslblCantidad→ Label: "Cantidad:"txtCantidad→ TextBox: número de unidadeslblPrecio→ Label: "Precio unitario ($):"txtPrecio→ TextBox: preciobtnGuardar→ 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
- Insertar el UserForm desde el Editor de VBA.
- Agregar controles desde el Toolbox y renombrarlos.
- Programar
UserForm_Initializepara cargar datos iniciales. - Programar el botón Guardar con validaciones y escritura en hoja.
- Programar el botón Cancelar con
Unload Me. - Crear una macro en módulo estándar para mostrar el formulario con
frmPedidos.Show. - Asignar esa macro a un botón en la hoja de Excel.