Saltar al contenido
Conéctate para seguir esto  
YoelMonsalve

Aporte al foro: Lista desplegable inteligente - parte 3.

Recommended Posts

 

Hola amigos del foro, estuve ausente un tiempo por asuntos de trabajao pero vuelvo para retomar un tema anterior del que prometí una tercera parte (y siempre debemos tratar de cumplir la palabra prometida jeje).

En aquélla ocasión explicaba cómo podemos, a partir de métodos "básicos", emular la función de la característica Validación de Datos de Excel, es decir, una lista desplegable que nos permite escoger dentro de un conjunto limitado de valores para una celda. El ejercicio es en realidad más que todo pedagógico porque si observamos bien el asunto, podríamos operar con macros para establecer el origen de la validación y así lograr un efecto similar, ... pero en fin ya estamos muy adelantados para retroceder.

En esta ocasión lo que queremos es rellenar fácilmente una tabla de competición cruzada de equipos. Los nombres de los equipos se dan en la Hoja1, agrupados en dos Divisiones o Ligas. En la segunda hoja queremos armar la tabla de juegos. Pero, y no sabría decir si en mi interés pedagógico (o en mi mala fe para complicar las cosas ... jeje), en cada partido sucede que ambos, tanto el equipo Casa como el Visitante podrían provenir de la División A o la B. Entonces, el rango de datos de la Lista Desplegable NO es fijo, sino que cambia entre las dos Ligas, según los OptionButtons situados en la parte de arriba de la hoja de Partidos.

Por lo que obligatoriamente debemos usar una macro para dinámicamente modificar el origen de datos del DropDown, según querramos elegir de la DivA o la DivB. Por lo cual modificamos ligeramente el método LOAD_Lst explicado en la parte 2 del tema (para poder pasar como segundo argumento el rango de datos a cargar) y creamos dos variantes, LOAD_DivA(), LOAD_DivB() para ser invocadas por los OptionButtons.

' Rellena el objeto Dropdown con los valores encontrados en la columna A
' de Hoja1.
Sub LOAD_Lst(Lst As DropDown, Header As Range)
	    Dim SheetName As String
    Dim S2 As Worksheet
    Dim i As Long, _
        N As Long
    
    ' Nombre de la hoja donde buscar los datos. Puede cambiarlo si es
    ' necesario.
    SheetName = "Equipos"
    Set S2 = Sheets(SheetName)
    
    ' calculando el número de elementos a cargar
    If Header.Offset(1, 0) = "" Then
        N = 0
    Else
        If Header.Offset(2, 0) = "" Then
            N = 1
        Else
            N = Header.End(xlDown).Row - 1
        End If
    End If
    If N = 0 Then Exit Sub      ' sale, si no hay elementos
    
    ' y rellena la lista
    Lst.RemoveAllItems
    For i = 1 To N
        Lst.AddItem Header.Offset(i, 0)
    Next
	End Sub
	' Cargar el DropDown con los equipos de la División A
Sub LOAD_DivA()
	    Dim mylst As DropDown
	    SET_Lst mylst
    If mylst Is Nothing Then Exit Sub
    LOAD_Lst mylst, Sheets("Equipos").[A1]
	End Sub
	' Cargar el DropDown con los equipos de la División B
Sub LOAD_DivB()
	    Dim mylst As DropDown
	    SET_Lst mylst
    If mylst Is Nothing Then Exit Sub
    LOAD_Lst mylst, Sheets("Equipos").[C1]
End Sub

Así que para llenar la tabla, por ejemplo en Partido 1, supongamos que juega el equipo Casa de la DivA vs. el equipo Visitante de la DivB. Entonces nos situamos en la celda C3 y marcamos el OptionButton "DivA", luego la lista muestra sólo los equipos de la División A y escogemos el equipo. Luego vamos a la celda D3 y marcamos el OptionButton "DivB", para elegir un equipo de la División B.

Y así repetimos todo el proceso, en el ejemplo dado para el segundo partido invertí la situación, poniendo el equipo Casa de la DivB vs. el equipo Visitante de la DivA, y así sucesivamente.

Te adjunto el archivo Excel para que lo pruebes y ¡no olvides! si te gustó este tema, recompénsame con un "me gusta".

================================================================================================

P.D.-  Viendo ahora el tema estoy pensando en crear una parte 4 - implementación de este mismo control usando Clases.

Compartir este mensaje


Enlace a mensaje
Compartir con otras webs
Conéctate para seguir esto  

×