Formularios

Formularios en Excel con VBA: crea tu primer UserForm

octubre 10, 2026 Tuto Excel 17 min read
Formularios en Excel con VBA: crea tu primer UserForm

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.

  1. Abre Excel y ve a Archivo > Opciones.
  2. En la ventana de Opciones, elige Personalizar cinta de opciones.
  3. En la columna de la derecha (Pestañas principales), marca la casilla Programador o Desarrollador (según tu versión).
  4. Pulsa Aceptar. La pestaña aparece al final de la cinta.

Ahora abre el editor de Visual Basic:

  1. Pulsa la tecla Alt + F11 (en Mac, Opción + F11 o ve a la pestaña Desarrollador > Visual Basic).
  2. Verás el Explorador de proyectos a la izquierda. Si no lo ves, activa Ver > Explorador de proyectos.
  3. Tu libro aparece como un proyecto (VBAProject (TuLibro.xlsx)).
Nota: a partir de ahora tu archivo debe guardarse como Libro habilitado para macros (.xlsm) porque lleva código VBA. Si lo guardas como .xlsx, Excel te avisará de que se perderán las macros.
Consejo: en el editor, pulsa 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í:

A2fx1
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
Empleados

Inserta el UserForm y coloca los controles

  1. En el editor (Alt+F11), ve a Insertar > UserForm. Aparece una ventana vacía llamada UserForm1 y el Cuadro de herramientas.
  2. Si el Cuadro de herramientas no se ve, actívalo con Ver > Cuadro de herramientas.
  3. 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).

Consejo: selecciona varios controles a la vez (clic en el primero y 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

  1. Selecciona el UserForm y, en la ventana Propiedades (F4), cambia Caption por Alta de empleados. El Name déjalo como UserForm1 por ahora.
  2. Selecciona el TextBox del nombre. En Propiedades:

– Name: txtNombre – Déjalo sin Caption (los TextBox no muestran texto fijo).

  1. Repite con el TextBox de apellidos: Name = txtApellidos.
  2. En el ComboBox: Name = cboDepto.
  3. En el botón: Name = btnAnadir y Caption = Añadir.
Cuidado: cambiar 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
A2fx=CONTARA(A2:A1000)
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
Empleados
Comprueba: al pulsar Añadir con los campos rellenos aparece 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.

  1. En el editor, ve a Insertar > Módulo.
  2. Escribe:

Sub AbrirFormulario()
    UserForm1.Show
End Sub
  1. Vuelve a la hoja Empleados y ve a la pestaña Desarrollador.
  2. Pulsa Insertar > Botón (el primero, dentro de Controles de formulario).
  3. Dibuja el botón en la hoja. Aparece el cuadro Asignar macro; elige AbrirFormulario.
  4. Clic derecho sobre el botón > Modificar texto y escribe Alta empleado.
DesarrolladorControlesInsertarBotón
Nota: también puedes lanzar la macro con Alt+F8, eligiendo 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.

A1fx**Ciudad**
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
Planner

Y la hoja Ciudades que alimenta las listas:

A1fx**Madrid**
A
1 Madrid
2 Barcelona
3 Sevilla
4 Bilbao
Ciudades

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
Consejo: 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
Comprueba: al pulsar OK con todos los datos aparece 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.

A1fx
A B C D E F G H I
1 A **B **C **D **E **F **G **H
2 1 ID Nombre Apellidos Email 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
Empleados

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:

  1. En la hoja Empleados, selecciona D2:D5 y en el Cuadro de nombres escribe Departamentos y 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
Comprueba: al abrir el formulario el ComboBox muestra los departamentos del rango con nombre, la jornada Completa aparece marcada por defecto y la fecha sale en formato dd/mm/yyyy. Al pulsar Guardar con los campos rellenos aparece el mensaje y la hoja tiene una fila nueva con las 8 columnas rellenas.

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:

  1. Corta el código de la hoja y pégalo en un Módulo (Insertar > Módulo).
  2. 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.
Nota: si necesitas un formulario que funcione también en la nube, la alternativa natural dentro del ecosistema de Microsoft es Microsoft Forms (encuestas y cuestionarios) o Power Apps, que sí viven en la web y en el móvil, aunque su forma de programar ya no es VBA.

Lo que ya sabes hacer con los UserForms y el siguiente paso

  • Crear el formulario desde Insertar > UserForm y dejarlo a tu gusto con la ventana Propiedades.
  • Colocar y renombrar controles (TextBox, ComboBox, ListBox, CheckBox, OptionButton, Frame, MultiPage, CommandButton) usando siempre el Name para VBA y el Caption para 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.