Saltar al contenido

ComboBox dependientes


Recommended Posts

Buenos días, gusto saludarles.

Tengo el siguiente código:

Private Sub cmb_tipo_persona_Change()

Dim valor, rango1, celda1, rango2, celda2, rango3, celda3, rango4, celda4, rango5, celda5 As Range
Set rango1 = Hoja2.[Personas_Físicas]
Set rango2 = Hoja2.[Sistema_de_Banca_de_Desarrollo]
Set rango3 = Hoja2.[Empresarial]
Set rango4 = Hoja2.[Corporativo]
Set rango5 = Hoja2.[Sector_Público]

valor = cmb_tipo_persona.Value

cmb_tipo_cartera.Clear
lbl_tipo_cartera.Caption = ""


    Select Case valor
        Case Is = "Personas_Físicas"
            For Each celda1 In rango1
                cmb_tipo_cartera.AddItem celda1.Value
            Next celda1
            
        Case Is = "Sistema_de_Banca_de_Desarrollo"
            For Each celda2 In rango2
                cmb_tipo_cartera.AddItem celda2.Value
            Next celda2
    
        Case Is = "Empresarial"
            For Each celda3 In rango3
                cmb_tipo_cartera.AddItem celda3.Value
            Next celda3
        
        Case Is = "Corporativo"
            For Each celda4 In rango4
                cmb_tipo_cartera.AddItem celda4.Value
            Next celda4
    
        Case Is = "Sector_Público"
            For Each celda5 In rango5
                cmb_tipo_cartera.AddItem celda5.Value
            Next celda5
    
    End Select
    
        find_code_tipo_persona

End Sub

Funciona perfecto, cuando hago una selección en el primer combobox, me cambia las opciones del segundo.

Sin embargo, las lineas:

cmb_tipo_cartera.Clear
lbl_tipo_cartera.Caption = ""

...hacen que cada vez que cambio el comboBox 1, se actualice el comboBox 2, así no se suman las opciones a elegir; eso está correcto, pero

...son las mismas que me están dando problema, ya que al cargar datos en el Userform, por medio de los siguientes códigos:

Private Sub UserForm_Activate()

Dim cantidad_filas As Integer

deshabilitar_controles

    If next_row_free() = 13 Then 'verifica si el excel esta vacio
        scrollNavegacion.Max = 13
    Else
        scrollNavegacion.Max = next_row_free() - 1
        cargarDatos (next_row_free() - 1)
   End If

End Sub

Sub cargarDatos(numeroFila As Integer)
    'Carga los datos
    lbl_solucion.Caption = Range("C" & numeroFila).Value
    lbl_nombre_solucion.Caption = Range("D" & numeroFila).Value
    lbl_tipo_persona.Caption = Range("M" & numeroFila).Value
    lbl_tipo_cartera.Caption = Range("N" & numeroFila).Value
    lbl_plan_inversion.Caption = Range("O" & numeroFila).Value
    lbl_origen_recursos.Caption = Range("P" & numeroFila).Value
    find_name_tipo_persona
'    activar_eventos
    find_name_tipo_cartera
    find_name_plan_inversion
    find_name_origen_recursos
   
End Sub

hacen que corra el evento "Change" del primer código que les copié y no permite que carguen los datos en el segundo combobox.

Si comento las lineas del clear del combo, funciona solamente cuando cambio el primer combo, pero no funciona a la hora de cargar y navegar entre registros.

Utilizar el evento Change  o el evento Click me hacen exactamente lo mismo y no me beneficia.

Espero haberme dado a entender y que me puedan colaborar.

Gracias,

Enlace a comentario
Compartir con otras webs

Hummm no encuentro la falla... me hace falta una cerveza ?.

Pero te voy a hacer unas recomendaciones a ver si así trabajas mejor.

Dim codigo As Range
Dim nombre As Range

Set codigo = Hoja2.[codigos_tipo_cartera]
Set nombre = Hoja2.[tipo_cartera]

Este tipo de declaraciones las haces en varias Sub, declaralas al inicio del Formulario afuera de cualquier SUB.

En Initialize ahí es donde las asignas con Set.

Dim valor, rango1, celda1, rango2, celda2, rango3, celda3, rango4, celda4, rango5, celda5, rango6, celda6, _
rango7, celda7, rango8, celda8, rango9, celda9 As Range

Set rango1 = Hoja2.[Consumo]
Set rango2 = Hoja2.[Vehículos]
Set rango3 = Hoja2.[Tarjeta_de_crédito]
Set rango4 = Hoja2.[Vivienda_residencial]
Set rango5 = Hoja2.[Microcrédito_SBD]
Set rango6 = Hoja2.[Banca_Segundo_Piso_SBD]
Set rango7 = Hoja2.[Banca_Desarrollo_SBD]
Set rango8 = Hoja2.[Micro_y_Pequeña_Empresa_1]
Set rango9 = Hoja2.[Mediana_Empresa_1]


valor = cmb_tipo_cartera.Value

cmb_plan_inversion.Clear
lbl_plan_inversion.Caption = ""

    Select Case valor
        Case Is = "Consumo"
            For Each celda1 In rango1
                cmb_plan_inversion.AddItem celda1.Value
             Next celda1
             
         Case Is = "Vehículos"
            For Each celda2 In rango2
                cmb_plan_inversion.AddItem celda2.Value
             Next celda2

Declaras Muchas Celda1, Celda2... con una Celda basta.

Si los rangos ya los tienes declarados, entonces úsalos en el For Each directamente o declaralos en Initializate y los variables Rango1, Rango2 al inicio del código del formulario.

Si los rangos no van a cambiar asi esta bien, pero si van a cambiar entonces crea Tablas en ves de Rango con nombres, o usa la Instruccion DESREF al dar el nombre al rango.

Y siempre en lo posible haz una SUB o Function fuera del código del Formulario o dentro del formulario, pero que te haga lo mismo. por ejemplo veo muchas  funciones como:

Function find_name_tipo_cartera()

Function find_code_plan_inversion()

....

Se pueden resumir en una sola.

 

HAY MUCHO TRABAJO POR HACER, PERO POCO A POCO.

 

 

 

Saludos.

 

 

Enlace a comentario
Compartir con otras webs

jajjajaja, la falla es que no hace la funcion cargar en el momento que se abre el formulario, esto por cuanto de una vez entra el evento change que le mencioné.

Pero bueno, de igual manera le agradezco muchísimo todos sus consejo, desde ya lo estoy tratado de poner en practica para optimizar el código.

De nuevo, muchas gracias Leopoldo, y le mando una birra (cerveza en Costa Rica) a la distancia, ajajajajaj

 

Enlace a comentario
Compartir con otras webs

Lamentablemente los controles ActiveX  no disponen de una opción EnableEvents de la que si disponen hojas y libros, por lo que es necesario fabricarlos a mano. Es fácil, define una variable a nivel formulario (p.e: SaltarEvento as Boolean) activála/desactívala cuando sea necesario y condiciona la ejecución el evento Change del combobox a que la variable esté desactivada, ejemplo:

Dim SaltarEvento as Boolean

Private Sub MiProcedimiento()

SaltarEvento = True

...

...

SaltarEvento = False

End Sub

'--

Private Sub ComoboBox1_(Change()

If SaltarEvento = True Then Exit Sub

...

...

End Sub

Por cierto, si te aseguras que los nombres de los rangos se corresponden con los elementos de cada combo, podrías dejar los procedimientos change de los combos mucho más sencillos, por ejemplo:

Private Sub cmb_tipo_persona_Change(): On Error Resume Next

If SaltarEvento = True Then Exit Sub
cmb_tipo_cartera.Clear
lbl_tipo_cartera.Caption = ""
If Not cmb_tipo_persona.ListIndex = -1 Then
   cmb_tipo_cartera.List = Hoja2.Range(cmb_tipo_persona).Value
   find_code_tipo_persona
End If

End Sub

 

 

 

Enlace a comentario
Compartir con otras webs

Archivado

Este tema está ahora archivado y está cerrado a más respuestas.

×
×
  • Crear nuevo...

Información importante

Echa un vistazo a nuestra política de cookies para ayudarte a tener una mejor experiencia de navegación. Puedes ajustar aquí la configuración. Pulsa el botón Aceptar, si estás de acuerdo.