Un UserForm de VBA es una ventana flotante que se abre dentro de Excel con cuadros de texto, listas desplegables, casillas y botones: el lector rellena ahí lo que necesita y el código lo pasa a la hoja. En este artículo montamos uno sobre una hoja de pedidos: el formulario pregunta nombre, ciudad, cena, fechas, si viene con acompañante, cuántos invitados y el importe, y al pulsar Aceptar escribe una fila nueva en la hoja. Funciona en Excel 2007, 2010, 2013, 2016, 2019, 2021, 2024 y Microsoft 365 para Windows y Mac, y también en Excel para la web, donde se puede abrir el editor y revisar el código aunque los UserForms solo se ejecutan en el escritorio.
Qué es un UserForm de VBA y para qué te sirve en una hoja
Imagina la hoja Pedidos de un restaurante: cada día caen cinco o diez reservas y alguien tiene que escribir a mano la fecha, el nombre del cliente, la ciudad, la cena, si viene con acompañante, cuántos invitados son y el importe. Si lo haces a mano, en un mes se te cuelan tres ciudades mal puestas, dos importes sin decimales y un buen número de filas vacías. El UserForm es la ventana que evita eso: en lugar de escribir celda a celda, abres una ficha con sus campos ya listos (una lista de ciudades, un desplegable de cenas, casillas para las fechas, un botón Sí/No para el acompañante, un cuadro numérico para el importe) y el código se encarga de llevar cada cosa a su columna.
La gracia es que el formulario controla la entrada: el usuario solo elige lo que le enseñas, no puede inventarse una ciudad que no estaba en la lista ni dejar el importe en blanco. Tú, cuando vuelves a la hoja, ves filas completas, ordenadas y con los mismos datos, sin tener que revisar nada.
El editor de VBA: dónde se escribe el código del formulario
El editor de Visual Basic (VBA) es el programa dentro de Excel donde se escriben las macros y los formularios. No es una herramienta aparte: vive dentro de Excel y se abre con una combinación de teclas.
- Abre Excel y ve a
Archivo > Opciones > Personalizar cinta de opciones. - En la columna derecha, marca la casilla
Programadory pulsaAceptar. La pestaña Programador aparece al final de la cinta. - Pulsa Alt+F11 para abrir el editor de VBA. Verás un panel a la izquierda con el nombre de tu libro (Proyecto) y a la derecha la zona en blanco donde se escribe el código.
Una vez dentro, el menú Insertar tiene dos opciones que vas a usar: Módulo (una hoja en blanco para escribir Sub y Function) y UserForm (un formulario visual para dibujar controles).
El Cuadro de herramientas y la ventana Propiedades
Cuando insertas un UserForm, el editor abre automáticamente dos paneles:
El Cuadro de herramientas se abre desde el menú Ver > Cuadro de herramientas si no lo ves. Cada icono es un control: haces doble clic o lo arrastras al formulario para colocarlo. La ventana Propiedades (tecla F4) muestra todo lo que se puede cambiar de cada control: su Name (cómo se llama desde VBA, sin tildes ni espacios) y su Caption (lo que ve el usuario, aquí sí con tildes y espacios). Las dos primeras cosas que tocarás siempre son esas.
Los controles del UserForm uno por uno
| Control | Para qué sirve | Propiedad que lleva el dato |
|---|---|---|
| Label (Etiqueta) | Texto fijo que describe un campo | Caption |
| TextBox (Cuadro de texto) | Donde el usuario escribe a mano | Text |
| ListBox (Cuadro de lista) | Lista visible de la que se elige uno o varios | List / Value |
| ComboBox (Cuadro combinado) | Lista desplegable que se abre al pulsar | Text / Value |
| CheckBox (Casilla) | Casilla independiente para marcar o desmarcar | Value (True/False) |
| OptionButton (Botón de opción) | Botón circular; varios juntos forman una elección única | Value |
| Frame (Marco) | Recuadro que agrupa controles, sobre todo OptionButton | (contenedor) |
| SpinButton (Botón de número) | Dos flechas arriba/abajo para subir o bajar un número | Value |
| CommandButton (Botón) | Botón para ejecutar una acción | Caption |
La regla práctica: si el campo tiene opciones fijas, usa ListBox, ComboBox o CheckBox; si es texto libre, TextBox; si es una cantidad, TextBox con un SpinButton al lado.
Montar un formulario de pedido paso a paso
Antes de tocar el editor, prepara la hoja que va a recibir los datos. Es una hoja normal con encabezados en la primera fila, igual que cualquier tabla.
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Fecha | Nombre | Ciudad | Cena | Acompañante | Invitados | Importe |
| 2 | 15/03/2026 | Lucía | Madrid | Vegetariana | Sí | 2 | 48,00 |
| 3 | 15/03/2026 | Pablo | Lima | Carnes | No | 4 | 96,00 |
=SI(A2>10;"Alto";"Bajo")). En Excel configurado con punto decimal (México, Estados Unidos) el separador es la coma.Dibujar y nombrar los controles del formulario
- En el editor de VBA, abre el formulario con
Insertar > UserForm. Ponle el nombrefrmPedidoen la ventana Propiedades (F4) y cambia suCaptiona "Nuevo pedido". - Inserta una
LabelconCaption"Nombre" y unTextBoxdebajo. Cámbiale elNamealTextBoxportxtNombre. - Inserta una
Label"Ciudad" y unListBoxconNamelstCiudad. - Inserta una
Label"Cena" y unComboBoxconNamecboCena. - Inserta una
Label"Fechas disponibles" y tresCheckBox:chkViernes,chkSabado,chkDomingo. - Inserta una
Label"¿Viene con acompañante?", unFrameconCaption"Acompañante", y dentro del Frame dosOptionButton:optSiyoptNo. - Inserta una
Label"Importe" y unTextBoxconNametxtImporte, y a su derecha unSpinButtonconNamespnImporteyMin=0,Max=500. - Inserta tres
CommandButton:cmdAceptar(Caption "Aceptar"),cmdLimpiar(Caption "Limpiar") ycmdCancelar(Caption "Cancelar").
Name no puede tener tildes ni espacios: txtImporte sí, txtImporte Total no. Es el nombre que escribirás en el código.Name de cada control coincide con la lista anterior.El código que muestra el formulario y deja los campos listos
Cada formulario tiene un módulo de código asociado: haz doble clic sobre el formulario en el editor y se abre. Ahí escribes un Sub que prepara los campos justo antes de mostrarlo: vacía los TextBox, rellena la ListBox y el ComboBox con AddItem, desmarca los CheckBox y deja el importe a 0.
Sub MostrarFormulario()
frmPedido.txtNombre.Text = ""
frmPedido.lstCiudad.Clear
frmPedido.lstCiudad.AddItem "Madrid"
frmPedido.lstCiudad.AddItem "Lima"
frmPedido.lstCiudad.AddItem "Santiago"
frmPedido.lstCiudad.AddItem "Bogotá"
frmPedido.cboCena.Clear
frmPedido.cboCena.AddItem "Vegetariana"
frmPedido.cboCena.AddItem "Carnes"
frmPedido.cboCena.AddItem "Pescados"
frmPedido.chkViernes.Value = False
frmPedido.chkSabado.Value = False
frmPedido.chkDomingo.Value = False
frmPedido.optSi.Value = False
frmPedido.optNo.Value = True
frmPedido.txtImporte.Text = "0"
frmPedido.Show
End Sub
Sub MostrarFormulario en un Módulo normal del libro (Insertar > Módulo). Lo lanzarás desde un botón de la hoja.Pasar lo escrito en el formulario a la hoja Pedidos
Ahora el código que copia cada control a su columna. Doble clic sobre el botón Aceptar y se abre el Sub cmdAceptar_Click.
Sub cmdAceptar_Click()
Dim fila As Long
fila = Worksheets("Pedidos").Cells(Rows.Count, 1).End(xlUp).Row + 1
Worksheets("Pedidos").Cells(fila, 1).Value = Date
Worksheets("Pedidos").Cells(fila, 2).Value = Me.txtNombre.Text
Worksheets("Pedidos").Cells(fila, 3).Value = Me.lstCiudad.Value
Worksheets("Pedidos").Cells(fila, 4).Value = Me.cboCena.Text
Worksheets("Pedidos").Cells(fila, 5).Value = IIf(Me.optSi.Value, "Sí", "No")
Worksheets("Pedidos").Cells(fila, 6).Value = Me.spnImporte.Value
Worksheets("Pedidos").Cells(fila, 7).Value = CDbl(Me.txtImporte.Text)
MsgBox "Pedido guardado en la fila " & fila
End Sub
Para Limpiar, el Sub cmdLimpiar_Click llama a MostrarFormulario pero sin mostrar el formulario, y para Cancelar, el Sub cmdCancelar_Click cierra la ventana con Unload Me.
Sub cmdLimpiar_Click()
Me.txtNombre.Text = ""
Me.lstCiudad.Clear
Me.cboCena.Clear
Me.chkViernes.Value = False
Me.chkSabado.Value = False
Me.chkDomingo.Value = False
Me.optNo.Value = True
Me.txtImporte.Text = "0"
End Sub
Sub cmdCancelar_Click()
Unload Me
End Sub
| A | B | C | D | E | F | G | |
|---|---|---|---|---|---|---|---|
| 1 | Fecha | Nombre | Ciudad | Cena | Acompañante | Invitados | Importe |
| 2 | 15/03/2026 | Lucía | Madrid | Vegetariana | Sí | 2 | 48,00 |
| 3 | 15/03/2026 | Pablo | Lima | Carnes | No | 4 | 96,00 |
| 4 | 15/03/2026 | Carmen | Bogotá | Pescados | Sí | 3 | 72,00 |
Ejecutar el formulario desde un botón en la hoja
Un formulario que solo se abre desde el editor no sirve. Lo normal es tener un botón visible en la hoja para lanzarlo.
- Vuelve a la hoja Pedidos y abre
Insertar > Formas > Rectángulo redondeado. - Dibuja el botón en la esquina superior derecha, escribe "Nuevo pedido" y pulsa Enter.
- Clic derecho sobre la forma, elige
Asignar macroy seleccionaMostrarFormulario. - Asegúrate de que la pestaña
Programador > Modo Diseñoestá desactivada (el icono aparece sin relleno). Si está activado, el botón solo funciona en modo edición.
Sub MostrarFormulario()
frmPedido.Show
End Sub
Mostrarlo con la macro ShowMyForm si la cinta se ha desconfigurado
Si la cinta de opciones se ha personalizado demasiado o el menú contextual no muestra Asignar macro, crea una macro específica y añádela a la Barra de herramientas de acceso rápido.
- Crea un
Suben un módulo:Sub ShowMyForm() / frmPedido.Show / End Sub. - Abre
Archivo > Opciones > Barra de acceso rápido. - En "Elegir comandos de", selecciona
Macros, eligeShowMyFormy pulsaAgregar >>. - Pulsa
Aceptar. La macro aparece como un icono en la barra superior.
Por qué el formulario no abre o no escribe en la hoja
Tres fallos reales con los que te vas a topar la primera vez, y la forma de arreglarlos.
«Se ha producido el error 1004 en tiempo de ejecución» al escribir la fórmula
El error 1004 sale al asignar una fórmula a una celda desde VBA cuando usas el nombre en español o el punto y coma dentro de .Formula. La propiedad .Formula espera los nombres de función en inglés y la coma como separador.
Sub Total()
Worksheets("Pedidos").Range("H2").Formula = "=G2*1,21"
End Sub
=G2*1,21 con coma decimal en .Formula y tu Excel usa coma como separador de argumentos, la fórmula se interpreta mal. Cambia a FormulaLocal o usa el punto: =G2*1.21.=G2*1,21
.Formula pones =SUMA(G2:G10) (nombre en español), VBA lanza el error 1004. Cambia a =SUM(G2:G10) o usa .FormulaLocal con =SUMA(G2:G10).=SUMA(G2:G10)
El botón de la cinta no muestra el formulario
Causa más común: guardaste el libro como .xlsx en lugar de .xlsm. Excel, al guardar en formato normal, borra todas las macros y los UserForms sin avisar más allá del cuadro de diálogo.
- Abre
Archivo > Guardar como. - En "Tipo", elige
Libro de Excel habilitado para macros (*.xlsm). - Confirma el aviso "Las macros se perderán" y guarda.
- Verifica también que la pestaña
Programadorestá visible (sin ella no se ve el botón de macros).
.xlsm descargado de internet, Excel bloquea las macros por seguridad. Ve a Archivo > Información > Habilitar contenido para desbloquarlas.Los OptionButton del Frame no se marcan
Si los OptionButton no están dentro del Frame, VBA los trata como un único grupo en todo el formulario: al marcar uno se desmarcan todos, pero no porque sea un grupo, sino porque están sueltos. Para que formen un grupo, los tienes que arrastrar dentro del Frame.
- Selecciona el
OptionButtoncon un clic. - Córtalo con Ctrl+X.
- Clic dentro del
Framey pega con Ctrl+V. El control aparece dentro del marco. - Repite con los demás
OptionButtondel grupo.
optSi desmarca optNo y al revés, sin importar cuántos OptionButton haya fuera del Frame.Lo que ya sabes hacer con un UserForm y el siguiente paso
- Abrir el editor de VBA con Alt+F11 y mostrar la pestaña Programador.
- Dibujar controles en un UserForm y cambiarles el
Namey elCaptiondesde la ventana Propiedades (F4). - Escribir tres
Sub: uno que prepara los campos y muestra el formulario, otro que pasa los datos a la hoja y un tercero que cierra la ventana conUnload Me. - Guardar el libro como
.xlsmpara que las macros no se pierdan al cerrar. - Lanzar el formulario desde un botón en la hoja o desde la Barra de acceso rápido.
El siguiente paso lógico es añadir una validación con If en cmdAceptar_Click para que el formulario no escriba la fila si, por ejemplo, el nombre está vacío, no se ha elegido ciudad o el importe no es un número. Con eso, el formulario deja de ser una ventana bonita para pasar a ser una herramienta que no deja pasar datos malos a la hoja.
Dudas al crear un formulario en Excel con VBA
1. ¿Cómo se hace un UserForm en Excel con VBA?
Abre el editor con Alt+F11, ve a Insertar > UserForm y dibuja los controles (cuadros de texto, botones, listas) desde el Cuadro de herramientas. Cada control se programa en su código de evento, por ejemplo el clic de un botón, donde escribes qué debe pasar al pulsar. En pocos minutos tienes un formulario básico listo para mostrar con UserForm1.Show.
2. ¿Hay algún PDF con ejemplos de código para UserForm en VBA?
No existe un único PDF oficial con ejemplos; en la documentación de learn.microsoft.com/es-es/office/vba encuentras la referencia completa de controles y eventos. La forma más práctica es guardar tus propios formularios como plantilla: guarda el libro como .xlsm y tendrás tus ejemplos reutilizables sin depender de descargas externas.
3. ¿Se puede hacer un formulario de entrada de datos totalmente automatizado en Excel?
Sí: el UserForm valida cada campo al perder el foco y, al pulsar el botón Guardar, ejecuta una macro que vuelca los datos en la hoja y limpia el formulario para el siguiente registro. Con un bucle For Each puedes recorrer controles y vaciarlos en una sola línea. El resultado es que el usuario solo escribe y pulsa un botón, sin tocar la hoja.
4. ¿Dónde puedo descargar UserForms ya hechos para Excel?
No conviene descargar formularios de sitios desconocidos: pueden incluir macros maliciosas. Lo seguro es crear el tuyo y guardarlo como .xlsm en tu carpeta de plantillas personal, así lo tienes disponible cada vez que abres Excel. Si necesitas ideas, en support.microsoft.com/es-es encontrarás ejemplos oficiales de Microsoft sobre controles y propiedades.
5. ¿Cómo se crea un UserForm en Excel paso a paso?
Pulsa Alt+F11 para abrir el editor VBA, elige Insertar > UserForm y aparecerá un formulario vacío con su Cuadro de herramientas. Arrastra al formulario los controles que necesites (Label, TextBox, CommandButton), ajusta sus propiedades en la ventana Propiedades (F4) y haz doble clic sobre un botón para escribir el código de su evento Click.
6. ¿Se puede tener un formulario en Excel sin usar VBA?
Sí, con el formulario clásico de Datos > Herramientas de datos > Formulario, que crea automáticamente una ventana de alta, baja y búsqueda a partir de los encabezados de tu tabla. Es más limitado que un UserForm, pero no requiere programar nada y sirve desde Excel 2010 hasta Microsoft 365. Solo tienes que tener la tabla bien definida y pulsar el botón.
Fuentes
- MicrosoftExcel – User Form – Microsoft Q&Aconsultado el 06/10/2026
- MicrosoftRange.Formula, FormulaLocal, FormulaR1C1 y FormulaR1C1Local — documentación oficialconsultado el 06/10/2026
- MicrosoftEl editor de VBA y la primera macro — documentación oficialconsultado el 06/10/2026
- MicrosoftReferencias relativas, absolutas y mixtas — documentación oficialconsultado el 06/10/2026
- MicrosoftUna celda vacía en una fórmula — documentación oficialconsultado el 06/10/2026