Hojas de cálculo en Excel - página principal

Formularios dinámicos

Ya hemos visto en otros artículos de este blog, cómo generar llenar dinámicamente un combobox. La cosa es muy sencilla, pues nos bastaba con determinar por ejemplo, un rango de celdas contiguo, que será el que tomaremos como conjunto de datos para llenar el combobox. Tan sencillo como eso. Lo único "complicado" es saber como se "escribe" eso en un macro, si no lo has hecho o no lo has visto nunca. Una vez le pillas el truquillo, los combobox dejan de tener secreto, y se convierten en algo bastante sencillo con lo que trabajar.

Ahora vamos a ver como mostrar diferentes controles en un formulario, dependiendo de una o varias condiciones. Cuando me refiero a controles, me refiero a mostrar etiquetas (label), combobox, o cualquier otro elemento que suele utilizarse en un formulario. Nosotros emplearemos 2 etiquetas (2 labels), 1 combobox, y 1 botón para cerrar el formulario.

Quizás os estéis preguntando ¿pero no es más fácil hacer varios formularios y lanzar uno u otro, dependiendo de si se cumple una u otra condición?. Es probable que así sea, pero ¿por qué no aprender a hacerlo todo en un único formulario?. Si lo hacemos con un único formulario, veremos la utilidad de hacer visible o invisible un control, dependiendo de si se cumple una condición u otra.

Vamos a trabajar con un ejemplo, para lo cual evaluaremos si se cumple una condición, y mostraremos la label1 en el caso de que se produzca esa condición, y la label2 y el combobox (le dejaremos el nombre que tiene por defecto, combobox1) en el caso de que no se produzca esa condición. Por concretarlo más, vamos a habilitar la celda C4 para que el usuario introduzca una fecha, que será el dato que evaluaremos (aunque puede ser cualquier otra condición, por supuesto). Si la fecha introducida corresponde al mes de agosto, mostraremos la label1, y si es cualquier otro mes del año, mostraremos la label2 y el combobox1.

Para empezar, diseñaremos el formulario, y colocaremos las 2 etiquetas, eliminando el texto que presentan por defecto, y que es el nombre de la propia etiqueta. En la siguiente imagen os he remarcado las 2 etiquetas para que se vean bien (ambas están vacías, sin texto, y tienen forma rectangular):



Si seleccionamos una de ellas, nos fijaremos en el nombre que tiene (en este caso, hemos seleccionado la etiqueta más pequeña, que es la label2):



Una vez creadas las etiquetas y el botón del formulario, crearemos también el combobox, para que nos quede algo como esto (he remarcado las etiquetas porque como se solapan, no se verían):



Crearemos también un botón en la hoja de cálculo (aparte del otro botón para cerrar el Userform), y le asociaremos este macro, que lanzará el Userform:


Sub formulario_dinamico()
'cargamos el formulario
UserForm1.Show
End Sub

Ahora copiaremos estos dos códigos que os incluyo a continuación, en el Userform. El primero de ellos, es el código asociado al botón del formulario, y cierra el mismo (el Userform), liberándolo de la memoria:


Private Sub CommandButton1_Click()
'Eliminamos el userform de la memoria
Unload UserForm1
End Sub

Este otro código lo que hace es cargar las label1, label2 y combobox1, en función de si se cumple la condición de que en la celda C4 figure o no, un día del mes de agosto:


Private Sub UserForm_Activate()
'ocultamos el procedimiento
Application.ScreenUpdating = False
'cargamos los objetos del formulario
'dependiendo de la fecha de la celda C4,
'para lo cual pasamos ese dato a una variable

fecha = Range("C4")
mes = Month(fecha)
'si la fecha es cualquier día de agosto (de cualquier año)
'entonces mostraremos un texto (un label)

If mes = 8 Then
'Mostramos el texto en el label1
Label1 = "En teoría en agosto, casi todo el mundo se cogerá unos" + Chr(13) & _
"días de vacaciones, y se irá a la playa a tomar el sol, a" + Chr(13) & _
"tomarse una cervecita, y a ""tapear""." & _
Chr(13) + Chr(13) & "¿Me puedes decir qué haces tú trabajando?."
'ocultamos la label2 y el combobox
Label2.Visible = False
ComboBox1.Visible = False
Else
'en caso contrario, es decir, si la fecha no es un
'día del mes de agosto, entonces ocultamos la label1

Label1.Visible = False
'mostramos el texto en el label2
Label2 = "Selecciona una opción:"
'llenamos el combobox con los datos del rango
'que hay en la hoja2 (bajando desde A1, hasta donde haya datos)
'pero antes lo limpiamos

ComboBox1.Clear
'seleccionamos la hoja1, y la celda A1
Hoja2.Select
Range("A1").Select
'llenamos el combobox
Do While ActiveCell <> Empty
'ponemos un item el el combobox
ComboBox1.AddItem ActiveCell.Value
'nos desplazamos hacia abajo
ActiveCell.Offset(1, 0).Select
Loop 'continuamos con el bucle
'Volvemos a la hoja1
Hoja1.Select
End If
'mostramos el procedimiento
Application.ScreenUpdating = True
End Sub

No hace falta que comente nada respecto a este último código, que es algo más extenso, porque el propio código fuente está comentado.

Desde aquí podéis descargar el fichero, con el ejemplo que hemos visto en este artículo.



5 comentarios:

Manu Méndez dijo...

Hola, Javier. Antes que nada, como soy nuevo, darte la enhorabuena por este blog. Es genial...

Soy muy novato en esto de programar formularios en Excel, y quiero hacer una aplicación y no sé si es la mejor opción.

Lo que quiero hacer es una aplicación simple de gestión de inventario de mercancías en almacén. Tendría 4 almacenes distintos y varios artículos. La idea sería abrir una solicitud de movimiento donde se dijese qué artículo se quiere mover (con cantidades, por ejemplo, 4 sillas) a otra ubicación distinta (es decir, de la tienda A a la tienda C).

Me lío al tener que introducir variables como cantidades disponibles mínimas, como gestionar el stock para poder chequearlo, etc.

¿Podrías darme alguna pista o enviarme algun fichero parecido a esto que tuvieras hecho?

Muchas gracias.

Mi correo es manuel.j.mendez arroba gmail.com

Sebas Pasini dijo...

Hola Javier!

Antes que nada queria comentarte que a nivel laboral tu blog me ha dado resultados excelentes y realmente agradezco todos los trucos y ayudas que publicas!!!!

Queria consultarte ahora por los formularios Dinamicos, arme uno siguiendo las instrucciones que publicaste y necesitaria saber como puedo hacer para bajar a una hoja de excel los datos que se carguen en ese formulario dinamico.

Muchas gracias de antemano.

Saludos

Sebastian Pasini (sebastian.pasini@gmail.com)

alexxxxxo dijo...

Hola, espero que me puedas o alguien más de los lectore spuedan ayudarme, abajo escribo el codigo de un formulario que logre diseñar en una hoja de excel (aclaro que practicamente nada conozco de programación, todo lo voy haciendo en forma autodidacta), pues bién,ahora necesito que el formulario me permita desplazarme por los registros de la base de datos, es decir que me funcione como el formulario que trae incorporado excel 2003, que me permita ir viendo en él mismos, los registros 1,2,3, etc, ya sea así o a la inversa, e incluso què pueda introducir un número y me lleve al registro que corresponda a ese numero.
Como lo tengo diseñado actualmente, solo me permite capturar datos nuevos y al vaciarlos a la hoja de excel me limpia el formulario, ahora quiero recorrer todos los registros uno por uno para poder ir modificando lo que haya capturado mal.
Gracias
Saludos
Alexx
Los Mochis, Sinaloa, México

Private Sub Agregardatos_Click()

'definición de variables
Dim iFila As Long
Dim Ws As Worksheet
Set Ws = Worksheets(1)

'encontrar la siguiente fila vacia
iFila = Ws.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

'Verificar que se ingrese un nombre
If Trim(Me.N_CONTRATO.Value) = "" Then
Me.N_CONTRATO.SetFocus
MsgBox "Debes Ingresar el Número de Contrato"
Exit Sub
End If

EN EL SIGUIENTE MENSAJE CONTINUA PORQUE NO ME ACEPTA EL BLOG MÁS CARACTERES

alexxxxxo dijo...

CONTINUACION DE MI PETICION

'Copiar los datos a la tabla de excel
Ws.Cells(iFila, 1).Value = Me.N_CONTRATO.Value
Ws.Cells(iFila, 2).Value = Me.TITULAR.Value
Ws.Cells(iFila, 3).Value = Me.CONYUGE.Value
Ws.Cells(iFila, 4).Value = Me.RFC_TITULAR.Value
Ws.Cells(iFila, 5).Value = Me.SUPERFICIE.Value
Ws.Cells(iFila, 20).Value = Me.FOLIO_ID_TITUL.Value
Ws.Cells(iFila, 21).Value = Me.FOL_ID_CONYUG.Value
Ws.Cells(iFila, 22).Value = Me.PROPIEDAD.Value
Ws.Cells(iFila, 23).Value = Me.PROP_DESCRIP.Value
Ws.Cells(iFila, 19).Value = Me.FECHA_VCTO.Value
Ws.Cells(iFila, 24).Value = Me.UBICAC_PARCELA.Value
Ws.Cells(iFila, 25).Value = Me.CURP.Value
Ws.Cells(iFila, 12).Value = Me.DOMICILIO.Value


Ws.Cells(iFila, 13).Value = Me.FECHA_CONTRAT.Value
Ws.Cells(iFila, 26).Value = Me.OTRA_GARANTIA.Value
Ws.Cells(iFila, 14).Value = ListBox1.Text
Ws.Cells(iFila, 27).Value = Me.obligado_solid.Caption
Ws.Cells(iFila, 28).Value = Me.sexo_list.Text
'limpiar el formulario
Me.N_CONTRATO.Value = ""
Me.TITULAR.Value = ""
Me.CONYUGE.Value = ""
Me.RFC_TITULAR.Value = ""
Me.SUPERFICIE.Value = ""
Me.FOLIO_ID_TITUL.Value = ""
Me.FOL_ID_CONYUG.Value = ""
Me.PROPIEDAD.Value = ""
Me.PROP_DESCRIP.Value = ""
Me.FECHA_VCTO.Value = ""
Me.UBICAC_PARCELA.Value = ""
Me.CURP.Value = ""
Me.DOMICILIO.Value = ""


Me.FECHA_CONTRAT.Value = ""
Me.OTRA_GARANTIA.Value = ""
Me.ListBox1.Value = ""
Me.obligado_solid.Value = ""
Me.sexo_list.Value = ""
Me.N_CONTRATO.SetFocus
End Sub

Private Sub APORTAC_Change()

End Sub

Private Sub CommandButton1_Click()

End Sub

Private Sub CerrarCuadro_Click()
Unload Me

End Sub

Private Sub CONCEPTO_Change()

End Sub

Private Sub CULTIVO_Change()

End Sub



Private Sub DOMICILIO_Change()

End Sub



Private Sub Etiqueta_Click()

End Sub

Private Sub FECHA_CONTRAT_Change()

End Sub

Private Sub Label13_Click()

End Sub

Private Sub Label14_Click()

End Sub

Private Sub Label15_Click()

End Sub

Private Sub Label16_Click()

End Sub

Private Sub Label19_Click()

End Sub

Private Sub Label2_Click()

End Sub

Private Sub Label5_Click()

End Sub

Private Sub Label7_Click()

End Sub

Private Sub Label8_Click()

End Sub

Private Sub Label9_Click()

End Sub

Private Sub ListBox1_Click()

End Sub

Private Sub ListBox2_Click()

End Sub

Private Sub N_CONTRATO_Change()

End Sub

Private Sub obligado_solid_Click()

End Sub

Private Sub OTRA_GARANTIA_Change()

End Sub

Private Sub PENDIENTE2_Change()

End Sub


Private Sub propiedad_Change()


End Sub

Private Sub sexo_list_Click()

End Sub

Private Sub superficie_Change()

End Sub



Private Sub TITULAR_Change()


End Sub



Private Sub UBICAC_PARCELA_Change()

End Sub


Private Sub UserForm_Click()

End Sub

Investigacion dijo...

Hola Alexxo, hace tiempo pusiste un post :

"Hola, espero que me puedas o alguien más ...excel 2003, que me permita ir viendo en él mismos, los registros 1,2,3, etc,...."

Bueno te comento q yo tenia el mismo problema, y si lo que quieres es lo mismo q tenia el 2003 en el excel 2007 andate a
Boton Redondo Excel-> Opciones de Excel->Comandos q no estan en la cinta de Opciones-> Formularios..... y listo!

y arriba a lado de tu boton redondo de excel , te saldrá el ícono de formularios automáticos de excel.

Aun asi d todas formas yo quiero personalizar más mis formularios como estabas haciendo con esa macro, la terminaste? me la puedes enviar porfa? scorpio_cool@hotmail.com
Gracias