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:
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
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)
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
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
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
Publicar un comentario