Un UserForm es la ventana flotante que aparece sobre tu hoja cuando necesitas pedirle algo sin que el usuario escriba directamente en las celdas. En este tutorial montas un alta de empleados paso a paso: empezarás con un formulario mínimo de nombre y apellidos y terminarás con uno con pestañas, listas, casillas y un menú de ciudades y cenas. Funciona desde Excel 2007 en adelante porque los UserForms viven en VBA, el mismo motor de macros de siempre. Para los ejemplos usamos el libro Empleados, con su hoja del mismo nombre y la pestaña extra Ciudades para cargar listas. Al terminar sabrás crear la ventana, arrastrar controles, escribir el código que mueve los datos a la hoja y resolver los errores típicos cuando algo no abre o no aparece.
Qué es un UserForm y para qué te sirve en Excel
Un UserForm es una ventana propia que tu libro de Excel abre por encima de las hojas cuando la necesitas, y que tú diseñas a tu gusto: textos, listas, casillas, botones. El usuario ve esa ventana, rellena lo que le pides y pulsa un botón para que sus datos acaben donde tú decides (normalmente, en una hoja).
El caso típico es una hoja Empleados con columnas ID, Nombre, Apellidos, Departamento. Si cada uno escribe a mano en la celda que le toca, al segundo día tienes nombres con mayúsculas distintas, IDs duplicados y departamentos escritos de cuatro formas. Con un UserForm, el usuario solo tiene que rellenar los campos del formulario; tú decides el orden, los textos, qué casillas son obligatorias y en qué columna cae cada cosa.
La otra gran utilidad es la de interfaz: para quien no maneja Excel a diario, abrir un libro y ver una cuadrícula es intimidante. Una ventana con etiquetas claras («Nombre», «Apellidos», «Departamento») y un desplegable con los departamentos válidos es mucho más amable. Y como el formulario vive dentro del propio archivo .xlsm, te lo llevas a cualquier sitio sin instalar nada más.
Las piezas del UserForm: controles, propiedades y código
La ventana del UserForm es un objeto con su nombre (por defecto, UserForm1) y sus propiedades. Dentro de ella colocas controles, piezas que arrastras desde el Cuadro de herramientas (Ver > Cuadro de herramientas). Los más usados son:
| Control | Nombre VBA | Para qué sirve |
|---|---|---|
| Etiqueta (Label) | Label | Texto fijo que explica al usuario qué escribir |
| Cuadro de texto (TextBox) | TextBox | Donde el usuario escribe una línea de texto |
| Cuadro combinado (ComboBox) | ComboBox | Lista desplegable de la que elige una opción |
| Cuadro de lista (ListBox) | ListBox | Lista visible de la que elige uno o varios |
| Casilla (CheckBox) | CheckBox | Casilla de verificación independiente |
| Botón de opción (OptionButton) | OptionButton | Botón circular; varios forman un grupo de elección única |
| Marco (Frame) | Frame | Recuadro que agrupa controles (también los OptionButton) |
| Botón de comando (CommandButton) | CommandButton | Botón que ejecuta una acción al hacer clic |
| Página múltiple (MultiPage) | MultiPage | Formulario con pestañas internas |
Cada control tiene su ventana Propiedades (Ver > Ventana Propiedades o F4), con docenas de campos. Los que más tocas son Name (cómo te refieres a él en VBA) y Caption (el texto que ve el usuario). Empieza siempre por renombrar el control: si lo dejas como TextBox1, el día que añadas un segundo cuadro de texto ya no sabes cuál es cuál.
UserForm, controles y eventos: cómo se hablan entre ellos
Un evento es algo que pasa y ante lo que tu código puede reaccionar: el formulario se abre, el usuario hace clic en un botón, cambia el texto de un cuadro, cierra la ventana. Por cada evento de cada control VBA abre un Sub listo para que escribas lo que quieras que pase.
Los eventos más usados son:
- Initialize del UserForm: se ejecuta una sola vez, cuando el formulario se va a abrir. Aquí cargas listas y dejas los valores por defecto.
- Click de un botón: se ejecuta cuando el usuario hace clic. Aquí validas y mueves datos a la hoja.
- Change de un TextBox o ComboBox: se ejecuta cada vez que el usuario cambia el valor. Útil para reaccionar a lo que escribe.
Cuando hagas doble clic sobre un control, el editor te lleva directamente al Sub de su evento por defecto. A partir de ahí, escribes las instrucciones y VBA las ejecuta cada vez que ese evento se dispara.
Antes de empezar: activa la pestaña Desarrollador y abre el editor
Los UserForms se construyen desde el editor de Visual Basic y los botones que los lanzan viven en la pestaña Desarrollador, que viene oculta. Vamos a activarla.
- Abre Excel y ve a
Archivo > Opciones. - En la ventana de Opciones, elige
Personalizar cinta de opciones. - En la columna de la derecha (Pestañas principales), marca la casilla Programador o Desarrollador (según tu versión).
- Pulsa
Aceptar. La pestaña aparece al final de la cinta.
Ahora abre el editor de Visual Basic:
- Pulsa la tecla Alt + F11 (en Mac, Opción + F11 o ve a la pestaña Desarrollador > Visual Basic).
- Verás el Explorador de proyectos a la izquierda. Si no lo ves, activa
Ver > Explorador de proyectos. - Tu libro aparece como un proyecto (
VBAProject (TuLibro.xlsx)).
Ver > Cuadro de herramientas y Ver > Ventana Propiedades la primera vez; te ahorrarás buscarlas cada vez.Tu primer UserForm: un alta sencilla de nombre y apellidos
Empezamos con lo mínimo: un formulario que pide Nombre, Apellidos y Departamento y, al pulsar Añadir, escribe una fila nueva en la hoja Empleados. La hoja queda así:
| A | B | C | D | |
|---|---|---|---|---|
| 1 | ID | Nombre | Apellidos | Departamento |
| 2 | 1 | Ana | Ruiz | Ventas |
| 3 | 2 | Pedro | Gómez | Marketing |
| 4 | 3 | Lucía | Castro | Operaciones |
Inserta el UserForm y coloca los controles
- En el editor (Alt+F11), ve a
Insertar > UserForm. Aparece una ventana vacía llamada UserForm1 y el Cuadro de herramientas. - Si el Cuadro de herramientas no se ve, actívalo con
Ver > Cuadro de herramientas. - Arrastra al formulario, en este orden:
– Un Label (Etiqueta) arriba a la izquierda con el texto Nombre. – Un TextBox (Cuadro de texto) a la derecha del Label. – Debajo, otro Label con el texto Apellidos y su TextBox al lado. – Debajo, un Label Departamento y un ComboBox (Cuadro combinado) al lado. – Abajo del todo, un CommandButton (Botón de comando).
Ctrl+Mayús+clic en los demás) y usa Formato > Igualar tamaño > Ambos para dejarlos uniformes antes de alinearlos.Cambia los nombres y los textos de cada control
- Selecciona el UserForm y, en la ventana Propiedades (F4), cambia
Captionpor Alta de empleados. ElNamedéjalo comoUserForm1por ahora. - Selecciona el TextBox del nombre. En Propiedades:
– Name: txtNombre – Déjalo sin Caption (los TextBox no muestran texto fijo).
- Repite con el TextBox de apellidos:
Name=txtApellidos. - En el ComboBox:
Name=cboDepto. - En el botón:
Name=btnAnadiryCaption= Añadir.
Caption cambia lo que ve el usuario; cambiar Name cambia cómo se llama el control en VBA. No los confundas.Escribe el código que añade la fila a la hoja
Haz doble clic sobre el botón Añadir. VBA abre el Sub btnAnadir_Click dentro del módulo de código del UserForm. Escribe:
Private Sub btnAnadir_Click()
Dim ws As Worksheet
Dim siguienteFila As Long
Set ws = ThisWorkbook.Worksheets("Empleados")
If txtNombre.Text = "" Or txtApellidos.Text = "" Or cboDepto.Text = "" Then
MsgBox "Rellena todos los campos.", vbExclamation
Exit Sub
End If
siguienteFila = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(siguienteFila, 1).Value = siguienteFila - 1
ws.Cells(siguienteFila, 2).Value = txtNombre.Text
ws.Cells(siguienteFila, 3).Value = txtApellidos.Text
ws.Cells(siguienteFila, 4).Value = cboDepto.Text
MsgBox "Empleado guardado.", vbInformation
txtNombre.Text = ""
txtApellidos.Text = ""
cboDepto.Text = ""
txtNombre.SetFocus
End Sub
Después, en el evento Initialize del propio formulario, carga los departamentos:
Private Sub UserForm_Initialize()
cboDepto.AddItem "Ventas"
cboDepto.AddItem "Marketing"
cboDepto.AddItem "Operaciones"
cboDepto.AddItem "Finanzas"
End Sub
| A | B | C | D | |
|---|---|---|---|---|
| 1 | ID | Nombre | Apellidos | Departamento |
| 2 | 1 | Ana | Ruiz | Ventas |
| 3 | 2 | Pedro | Gómez | Marketing |
| 4 | 3 | Lucía | Castro | Operaciones |
| 5 | 4 | Marta | Sanz | Finanzas |
Empleado guardado. y en la hoja aparece una fila nueva con el siguiente ID. Si dejas un campo vacío, aparece Rellena todos los campos. y no se añade nada.Crea la macro que abre el formulario y ponla a mano
Falta la forma de abrir el formulario desde la hoja. Vamos por una macro en un módulo normal.
- En el editor, ve a
Insertar > Módulo. - Escribe:
Sub AbrirFormulario()
UserForm1.Show
End Sub
- Vuelve a la hoja Empleados y ve a la pestaña Desarrollador.
- Pulsa
Insertar > Botón(el primero, dentro de Controles de formulario). - Dibuja el botón en la hoja. Aparece el cuadro Asignar macro; elige
AbrirFormulario. - Clic derecho sobre el botón >
Modificar textoy escribe Alta empleado.
AbrirFormulario y pulsando Ejecutar.Un formulario con más controles: el "Dinner Planner" paso a paso
Subimos el listón: ahora el usuario elige ciudad, cena, varias fechas con casillas, confirma si lleva coche, indica el dinero disponible con un botón giratorio y tiene tres botones (OK, Limpiar, Cancelar). La hoja Planner recoge lo que rellene.
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Ciudad | Cena | Fechas | Coche | Presupuesto |
| 2 | Madrid | Italiana | Vie, Sáb | Sí | 45,00 |
| 3 | Sevilla | Japonesa | Sáb | No | 30,00 |
Y la hoja Ciudades que alimenta las listas:
| A | |
|---|---|
| 1 | Madrid |
| 2 | Barcelona |
| 3 | Sevilla |
| 4 | Bilbao |
Rellenar listas y combos con AddItem y con un rango de la hoja
Para el ListBox de ciudades leemos directamente de la hoja Ciudades con .List, así si añades una ciudad solo tienes que tocar la hoja:
Private Sub UserForm_Initialize()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Ciudades")
lstCiudad.List = ws.Range("A1:A4").Value
cboCena.AddItem "Italiana"
cboCena.AddItem "Japonesa"
cboCena.AddItem "Mexicana"
cboCena.AddItem "Vegetariana"
spnPresupuesto.Min = 10
spnPresupuesto.Max = 200
spnPresupuesto.Value = 30
End Sub
AddItem te vale para listas cortas que no cambian; Range("A1:A4").Value te vale para listas que viven en la hoja y que el usuario puede mantener actualizadas sin tocar el código.El botón OK lleva los datos a la hoja y Cancelar cierra sin guardar
Private Sub OKButton_Click()
Dim ws As Worksheet
Dim f As Long
Dim fechas As String
If lstCiudad.ListIndex = -1 Then
MsgBox "Elige una ciudad.", vbExclamation
Exit Sub
End If
If cboCena.Text = "" Then
MsgBox "Elige una cena.", vbExclamation
Exit Sub
End If
fechas = ""
If chkViernes.Value Then fechas = fechas & "Vie, "
If chkSabado.Value Then fechas = fechas & "Sáb, "
If chkDomingo.Value Then fechas = fechas & "Dom, "
If Right(fechas, 2) = ", " Then fechas = Left(fechas, Len(fechas) - 2)
Set ws = ThisWorkbook.Worksheets("Planner")
f = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(f, 1).Value = lstCiudad.Value
ws.Cells(f, 2).Value = cboCena.Text
ws.Cells(f, 3).Value = fechas
ws.Cells(f, 4).Value = IIf(optCocheSi.Value, "Sí", "No")
ws.Cells(f, 5).Value = spnPresupuesto.Value
MsgBox "Plan guardado.", vbInformation
Unload Me
End Sub
Private Sub ClearButton_Click()
lstCiudad.ListIndex = -1
cboCena.ListIndex = -1
chkViernes.Value = False
chkSabado.Value = False
chkDomingo.Value = False
optCocheNo.Value = True
spnPresupuesto.Value = 30
End Sub
Private Sub CancelButton_Click()
Unload Me
End Sub
Plan guardado., el formulario se cierra y la hoja Planner tiene una fila nueva con los valores elegidos. Al pulsar Limpiar los controles vuelven a su estado inicial y al pulsar Cancelar el formulario se cierra sin tocar la hoja.MultiPage: un formulario con pestañas para no liar al usuario
Cuando un formulario tiene muchos campos, lo mejor es repartirlos en pestañas con un control MultiPage. Cada pestaña es un Page con sus controles dentro. El usuario hace clic en la pestaña y ve solo lo que necesita.
Creamos un MultiPage con dos páginas: Datos personales (Nombre, Apellidos, Email, Teléfono) y Datos del puesto (Departamento, Fecha, Tipo de contrato, Jornada completa/parcial con OptionButton). Un solo botón Guardar abajo del todo (en el formulario, no dentro de ninguna página) recoge todos los datos.
| A | B | C | D | E | F | G | H | I | |
|---|---|---|---|---|---|---|---|---|---|
| 1 | A | **B | **C | **D | **E | **F | **G | **H | |
| 2 | 1 | ID | Nombre | Apellidos | Teléfono | Departamento | Fecha | Jornada | |
| 3 | 2 | 1 | Ana | Ruiz | ana@empresa.com | 600123456 | Ventas | 01/02/2026 | Completa |
| 4 | 3 | 2 | Pedro | Gómez | pedro@empresa.com | 600654321 | Marketing | 15/03/2026 | Parcial |
El evento Initialize que prepara el formulario al abrirlo
Cargar el ComboBox de departamentos desde un rango con nombre evita escribir los departamentos a fuego en el código:
- En la hoja Empleados, selecciona
D2:D5y en el Cuadro de nombres escribeDepartamentosy pulsa Entrar.
Private Sub UserForm_Initialize()
cboDepartamento.List = ThisWorkbook.Names("Departamentos").RefersToRange.Value
optCompleta.Value = True
optParcial.Value = False
txtFecha.Text = Format(Date, "dd/mm/yyyy")
End Sub
El botón Guardar del formulario recoge los datos de ambas páginas y los escribe en la hoja en una sola fila:
Private Sub btnGuardar_Click()
Dim ws As Worksheet
Dim f As Long
If txtNombre.Text = "" Or txtApellidos.Text = "" Then
MsgBox "Falta nombre y apellidos.", vbExclamation
Exit Sub
End If
Set ws = ThisWorkbook.Worksheets("Empleados")
f = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
ws.Cells(f, 1).Value = f - 1
ws.Cells(f, 2).Value = txtNombre.Text
ws.Cells(f, 3).Value = txtApellidos.Text
ws.Cells(f, 4).Value = txtEmail.Text
ws.Cells(f, 5). = txtTelefono.Text
ws.Cells(f, 6).Value = cboDepartamento.Text
ws.Cells(f, 7).Value = txtFecha.Text
ws.Cells(f, 8).Value = IIf(optCompleta.Value, "Completa", "Parcial")
MsgBox "Empleado guardado.", vbInformation
Unload Me
End Sub
Por qué tu UserForm no se abre o no se ve
Tres causas reales, las tres con la hoja o el editor delante.
El botón de la cinta no muestra nada al pulsarlo
Lo que ves: pulsas el botón Alta empleado y no pasa nada, o aparece un pantallazo de error de VBA.
Causa: la macro AbrirFormulario apunta a un nombre de formulario que ya no se llama así (por ejemplo, lo renombraste a frmAlta pero la macro sigue diciendo UserForm1.Show).
Arreglo: abre el módulo (Alt+F11 > doble clic en Módulos > Módulo1) y cambia el nombre:
Sub AbrirFormulario()
frmAlta.Show
End Sub
Después, clic derecho sobre el botón de la hoja > Asignar macro > AbrirFormulario > Aceptar.
#¡NOMBRE? o "Sub o Function no definido" al ejecutar
Lo que ves: el error #¿NOMBRE? aparece en la barra de estado al abrir el formulario, o VBA muestra Sub o Function no definido al pulsar Añadir.
Causa: el código del botón está pegado en el módulo de la hoja (clic derecho sobre la pestaña de la hoja > Ver código) en vez de en un Módulo normal, o el Name del control en VBA no coincide con el del formulario.
Arreglo:
- Corta el código de la hoja y pégalo en un Módulo (
Insertar > Módulo). - En el formulario, revisa los nombres reales (
txtNombre,cboDepto,btnAnadir) y corrige las erratas en el código.
Los datos se pegan en la fila equivocada o se borran al validar
Lo que ves: la nueva fila aparece encima del encabezado, o las filas existentes desaparecen al pulsar Añadir.
Causa: UsedRange cuenta desde la primera fila con datos, incluido el encabezado, y suma 1 por encima de él. Si la hoja tiene una Tabla con autofiltros, VBA puede saltarse filas ocultas.
Arreglo: sustituye UsedRange por la búsqueda desde el final, que es lo que ya usamos arriba:
siguienteFila = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
Si la hoja es una Tabla, quítale los autofiltros o referencia directamente ws.ListObjects("TablaEmpleados").ListRows.Add.
Lo que tu Excel puede y no puede hacer con UserForms
Los UserForms viven dentro del motor de macros VBA, así que todo lo que VBA puede hacer, lo pueden hacer tus formularios: leer y escribir celdas, abrir otros libros, hablar con archivos, proteger hojas, validar datos antes de guardarlos y hasta lanzar otras macros. Por eso siguen siendo la forma más rápida de montar una mini-aplicación dentro de un .xlsm sin instalar nada más.
Tienen dos límites importantes que conviene saber de antemano:
- Excel para la web y Excel para móviles no ejecutan macros. Si guardas el archivo en OneDrive y lo abres desde el navegador, el botón Alta empleado no abrirá nada. Lo mismo ocurre en la app de móvil.
- Excel para Mac trae el editor de VBA, pero algunos controles (sobre todo los más modernos como WebBrowser y controles ActiveX de terceros) se comportan de forma distinta o directamente no existen.
Lo que ya sabes hacer con los UserForms y el siguiente paso
- Crear el formulario desde
Insertar > UserFormy dejarlo a tu gusto con la ventana Propiedades. - Colocar y renombrar controles (TextBox, ComboBox, ListBox, CheckBox, OptionButton, Frame, MultiPage, CommandButton) usando siempre el
Namepara VBA y elCaptionpara el usuario. - Escribir el código de los botones y de los eventos (Initialize, Click) para validar, mover datos a la hoja y limpiar los controles.
- Abrir el formulario desde la hoja con un botón de la pestaña Desarrollador o con Alt+F8.
El siguiente paso natural es convertir la hoja Empleados en una Tabla (Inicio > Estilos > Dar formato como tabla) y cambiar la macro para que las altas se acumulen dentro de la Tabla con ListRows.Add. Así no rompes formatos, los filtros siguen funcionando y el rango crece solo con cada empleado nuevo.
Datos comprobados en octubre de 2026.
Dudas al crear tu primer UserForm en Excel
1. Ejemplos de UserForm en Excel con VBA
Un ejemplo típico es un formulario para dar de alta clientes: un cuadro de texto para el nombre, otro para el email y un botón Guardar que lleva los datos a la hoja con una sola línea de código. En el tutorial verás paso a paso cómo montar uno así, con el UserForm, los controles y la macro que vuelca la información a la hoja.
2. ¿Se puede hacer un formulario en Excel sin usar VBA?
Sí, con la herramienta Formularios de la pestaña Programador puedes insertar botones, casillas y listas directamente en la hoja, aunque son mucho más limitados que un UserForm. Si necesitas algo más vistoso y con validaciones, el camino real pasa por VBA, que es lo que cubre este artículo.
3. Ejemplos avanzados de UserForm en Excel
Un UserForm avanzado combina varios controles (cuadros combinados, listas, casillas de verificación), valida los datos antes de guardarlos y se conecta con varias hojas o con un libro externo. En el tutorial dejamos la base sencilla y, sobre ella, te mostramos cómo añadir esas mejoras cuando lo necesites.
4. Descargar un UserForm hecho en Excel con VBA
El archivo de ejemplo del tutorial incluye un libro .xlsm con el UserForm ya montado y la macro lista para ejecutar, así puedes abrirlo y ver cómo está hecho por dentro. Recuerda que para usarlo necesitas activar las macros al abrirlo y que el formato .xlsm es el que conserva el código VBA.
5. Cómo crear un UserForm en Excel con VBA
Abre el editor con Alt+F11, inserta un UserForm desde Insertar > UserForm, arrastra los controles desde el cuadro de herramientas y haz doble clic sobre el botón Guardar para escribir la macro que pasa los datos a la hoja. Con esos cuatro pasos tienes tu primer formulario funcionando, y el tutorial los desarrolla uno por uno.
6. Descargar una plantilla de formulario para Excel
En la zona de descargas del tutorial tienes una plantilla .xlsm con el UserForm ya construido: la abres, activas las macros y escribes en los campos para ver cómo se vuelcan los datos en la hoja. Es la forma más rápida de tener un punto de partida y modificarlo después a tu caso.
7. Formulario de entrada de datos totalmente automático en Excel
La clave es encadenar eventos: que al abrir el UserForm se carguen los datos en una lista, que al pulsar un botón se valide lo escrito y se inserte una fila nueva en la hoja, y que al guardar se limpie el formulario para el siguiente registro. Con eso, y unas pocas líneas de VBA, consigues una entrada de datos casi sin tocar el teclado.