🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA UserForm en Excel — crea un formulario de entrada de datos real

|

VBA UserForm en Excel — crea un formulario de entrada de datos real

Probado en: Excel 365 v2509 · Excel 2021 · Excel 2019 · última verificación: 06/06/2026

En resumen — Un UserForm es un cuadro de diálogo propio que diseñas una vez y controlas con código de evento. Añade controles, escribe lo que hace cada botón y muéstralo. Todo en tres piezas:

' 1. En el módulo del formulario — código que se ejecuta al pulsar Aceptar:
Private Sub btnOK_Click()
    If txtName.Value = "" Then
        MsgBox "El nombre es obligatorio.", vbExclamation
        Exit Sub
    End If
    Me.Hide          ' ocultar, pero MANTENER los valores legibles para el llamador
End Sub

' 2. En el módulo del formulario — Cancelar solo cierra:
Private Sub btnCancel_Click()
    Me.Tag = "cancel"
    Me.Hide
End Sub

' 3. En un módulo normal — mostrar y leer lo escrito:
Sub AgregarRegistro()
    With frmEntry
        .Show                              ' se detiene aquí hasta que el formulario se oculte
        If .Tag = "cancel" Then Unload frmEntry: Exit Sub
        Cells(Rows.Count, 1).End(xlUp).Offset(1).Value = .txtName.Value
    End With
    Unload frmEntry                        ' destruirlo solo después de leer
End Sub

¿Alguna vez te preguntaste «por qué el cuadro de texto está vacío si el usuario lo rellenó»? — esa es la regla Hide-contra-Unload, y es el corazón de esta guía.

El modelo mental: sueltas el volante, conduce el formulario

MsgBox e InputBox son síncronos: se ejecuta una línea, obtienes un valor, se ejecuta la siguiente. Un UserForm rompe ese ritmo. Cuando llamas a .Show, tu código cede el volante al formulario y se pausa. Lo que ocurre después no lo decide la siguiente línea de tu macro — sino qué control pulsa el usuario, y cada uno ejecuta su propio trocito de código.

La pregunta que hace todo principiante — «¿adónde fue mi código tras UserForm1.Show — tiene una respuesta clara: está esperando. El trabajo de verdad se mudó a los procedimientos de evento de los controles, como btnOK_Click. Un UserForm son tres cosas pegadas:

  1. El diseño — los controles que arrastras encima (TextBox, ComboBox, CommandButton), configurados una vez en tiempo de diseño.
  2. El código de evento — procedimientos Private Sub dentro del módulo del formulario, uno por cada acción posible del usuario.
  3. La llamadafrmEntry.Show desde un módulo normal.

En cuanto lo ves como «un objeto que ejecuta código cuando lo tocas», y no como «una función que devuelve un valor», los UserForms dejan de ser un misterio.

Crea uno en tres pasos

  1. En el editor de VBA (Alt+F11), Insertar ▸ UserForm. En Propiedades, pon (Name) a frmEntry — nombrar formularios y controles ahora te ahorra el caos TextBox1, TextBox2 después.
  2. Desde el Cuadro de herramientas, arrastra: dos TextBox (txtName, txtQty), un ComboBox (cboDept) y dos CommandButton (btnOK, btnCancel). Añade etiquetas al lado.
  3. Haz doble clic en un botón — el editor te deja directamente en su evento _Click. Ahí vive su comportamiento.

La única regla: Me.Hide conserva los valores, Unload Me los destruye

Esta regla decide si tu formulario funciona como herramienta de entrada.

  • Unload Me quita el formulario de la memoria y reinicia cada control a vacío. Lee txtName.Value tras un Unload y obtienes "" — los datos se han ido.
  • Me.Hide vuelve el formulario invisible pero lo deja vivo en memoria, con los valores intactos. La ejecución vuelve a la línea posterior a .Show, y el llamador todavía puede leer frmEntry.txtName.Value.

Así que el patrón para cualquier formulario que devuelve datos es: Aceptar llama a Me.Hide, el llamador lee los controles, y solo entonces el llamador hace Unload. Un Unload Me dentro de btnOK_Click es la causa más común de «el formulario pierde lo que escribí».

Private Sub btnOK_Click()
    ' validar primero, luego OCULTAR (aquí no Unload)
    If Not IsNumeric(txtQty.Value) Then
        MsgBox "La cantidad debe ser un número.", vbExclamation
        txtQty.SetFocus
        Exit Sub
    End If
    Me.Hide
End Sub

Configura el formulario en UserForm_Initialize

Todo lo que el formulario necesita antes de que el usuario lo vea — las opciones de las listas, los valores por defecto, la fecha de hoy — va en el evento UserForm_Initialize, no en la macro que lo llama. Así el formulario queda autónomo: es correcto cada vez que se abre, sin importar quién lo muestre.

Private Sub UserForm_Initialize()
    cboDept.List = Array("Ventas", "Finanzas", "Operaciones")   ' llenar la lista
    txtQty.Value = "1"                                          ' valor por defecto sensato
    txtName.SetFocus                                            ' el cursor empieza aquí
End Sub

.Show es modal por defecto (vbModal): el usuario debe atender el formulario antes de tocar la hoja, y tu código que llama espera. Eso es lo que quieres para la entrada de datos. Usa .Show vbModeless solo para una paleta flotante que el usuario mantiene abierta mientras trabaja — y ten presente que entonces tu macro continúa sin esperar.

frmEntry.Show               ' modal — el llamador se pausa (lo habitual)
frmTools.Show vbModeless    ' no modal — el llamador sigue, el formulario flota

No lo sobrecablees

Una trampa tentadora: esparcir eventos _Change por cada control para validación «en vivo». Se disparan sin parar, se llaman entre sí y convierten la depuración en un juego de topos. Valida una vez, en btnOK_Click, y luego oculta. Mantén cada procedimiento de evento corto y con un solo propósito.

Y reconoce cuándo un UserForm es directamente la respuesta equivocada: si colocas más de 10 campos y se sale de una pantalla, esa es la señal para repartirlos en un MultiPage — o para admitir que los datos van de verdad en una simple tabla de Excel donde el usuario escribe directamente. Un UserForm vale la pena con unos 3–8 campos con validación real; por debajo, una cadena de InputBox es más ligera, y por encima, una hoja de cálculo suele ganarle al formulario.

Errores frecuentes con UserForm (y la solución)

Síntoma Causa Solución
Cuadro de texto vacío tras rellenarlo Unload Me en btnOK_Click borró los valores Usar Me.Hide; que el llamador lea, luego Unload
La lista desplegable está vacía Se llenó en la macro que llama, no en el formulario Poblarla en UserForm_Initialize
«Se requiere un objeto» en el nombre del formulario Control referenciado antes de cargar el formulario Mostrar el formulario primero, o leer vía la variable de formulario
El código tras .Show se ejecuta demasiado pronto Formulario mostrado vbModeless por error Usar .Show simple (modal) para la entrada
No se distingue Aceptar de Cancelar No se marcó nada al cancelar Poner Me.Tag = "cancel" (o un booleano público) antes de ocultar
La ✕ roja se comporta como Aceptar QueryClose sin gestionar Tratar la ✕ como Cancelar en UserForm_QueryClose

Un formulario es mucha fontanería para «pregúntame tres cosas»

Los UserForms son la herramienta adecuada para una entrada de datos real — pero los controles, el Initialize, el baile Hide-contra-Unload y la validación son mucho cableado antes de guardar una sola fila. Cuando el objetivo es solo «recoger un nombre, una cantidad y un departamento, y añadirlos como fila», ExcelMaster Agent te deja describirlo en español sencillo y construye el flujo de entrada y la escritura por ti — sin un módulo de formulario que mantener. Prueba gratis →

Otras guías

Preguntas frecuentes

¿Qué es un UserForm en VBA? Un UserForm es un cuadro de diálogo propio que diseñas en el editor de VBA y controlas con código de evento. Arrastras controles encima (cuadros de texto, listas desplegables, botones), escribes un procedimiento para cada acción posible del usuario y lo muestras con .Show. Así VBA recoge varias entradas a la vez, más allá de lo que permiten MsgBox o InputBox.

¿Cómo creo un UserForm en Excel VBA? Pulsa Alt+F11, luego Insertar ▸ UserForm. Arrastra controles desde el Cuadro de herramientas, nómbralos en la ventana Propiedades y haz doble clic en un botón para escribir su evento _Click. Muestra el formulario desde un módulo normal con frmNombre.Show.

¿Por qué mi cuadro de texto de UserForm está vacío tras escribir el usuario? Porque llamaste a Unload Me dentro del botón Aceptar, lo que destruye el formulario y vacía todos los controles. Usa Me.Hide en el evento Aceptar — mantiene el formulario (y sus valores) en memoria para que el código que llama pueda leer frmNombre.txtName.Value, y luego Unload.

¿Cuál es la diferencia entre Unload Me y Me.Hide? Me.Hide vuelve el formulario invisible pero lo mantiene cargado, así sus valores siguen siendo legibles. Unload Me quita el formulario de la memoria y reinicia todos los controles. Usa Hide cuando necesites leer las entradas tras cerrar; Unload cuando hayas terminado de verdad.

¿Cómo lleno un ComboBox en un UserForm? Puéblalo en el evento UserForm_Initialize para que esté listo antes de aparecer: cboDept.List = Array("Ventas", "Finanzas", "Operaciones"), o asigna cboDept.RowSource = "Hoja1!A1:A10" para enlazarlo a un rango de celdas.

¿El formulario debe ser modal o no modal? Usa modal (el .Show por defecto) para la entrada de datos — el usuario debe terminar el formulario antes de hacer cualquier otra cosa, y tu código espera el resultado. Usa .Show vbModeless solo para un formulario flotante tipo barra de herramientas que el usuario mantiene abierto mientras trabaja en la hoja.