Saltar al contenido

ComboBox dependientes


Recommended Posts

publicado

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,

publicado

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.

 

 

publicado

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

 

publicado

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

 

 

 

Archivado

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

  • 109 ¿Te parecen útiles los tips de las funciones? (ver tema completo)

    1. 1. ¿Te parecen útiles los tips de las funciones?


      • No
      • Ni me he fijado en ellos

  • Ayúdanos a mejorar la comunidad

    • Donaciones recibidas este mes: 0.00 EUR
      Objetivo: 130.00 EUR
  • Archivos

  • Estadísticas de descargas

    • Archivos
      187
    • Comentarios
      97
    • Revisiones
      28

    Más información sobre "Un juego del Rabino en Excel"
    Última descarga
    Por pegones1

    1    1

  • Crear macros Excel

  • Mensajes

    • Vale mil gracias, en vdd se agradece todo el apoyo y comentarios
    • Hola nuevamente. Por eso la importancia de lo que mencionas tú como "ruta relativa". Tal cual comentas, y aún sin llegar a algunos detalles importantes para ayudarte, en realidad tal cual te comenté le día miércoles, pues sí podías hacer como comentabas, era cosa de obtener los Id de Windows (como tú los llamas) y la ruta de OneDrive en casa usuario y eso sí se puede obtener con VBA y luego pasarlo a PQ, pero medio que te cerraste en que "PQ no puede trabajar con rutas relativas", cosa cierta pero siempre hay formas. Si SAP puede o no guardar en OneDrive o SharePoint, pues si está mapeado en la PC ¡claro que se puede! Pero bueno, creo que si te es útil tu propia propuesta ¡avanza con eso!
    • Perdona @Abraham Valencia pero he estado liado estos días. En realidad todo el problema se reduce a estos dos problemas: Problema 1: El script que "fabrica" SAP y que luego "pego" en la macro, no es capaz de  guardar archivos en SharePoint. He estado buscando, y en realidad muchas personas tienen ese problema (no poder guardar un Excel en SAP a través de VBA). Eso muy probablemente sean problemas de permisos, que no puedo cambiar (no soy administrador de nada). Como no puedo solucionarlo así, paso al plan B, que es guardar en Excel que me genera SAP en el ordenador de cada usuario que ejecute la plantilla (y que sí está guardada en SharePoint), para después con PowerQuery llamar a ese Excel (el export). Para ello, pretendo guardar el export, en la ruta relativa "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" donde los \..\..\..\ saltan las rutas personales de cada usuario (tipo C:\users\IDusuario\). Eso lo hace bien, y el archivo se guarda en la ruta de cada usuario que lo usa, pero surge el problema 2 Problema 2: PowerQuery no trabaja con rutas relativas del tipo  "C:\..\..\..\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" necesita que sea del tipo fija "C:\users\IDusuario\OneDrive - NombreEmpresa\Documentos\SAP\SAP GUI" pero claro, IDusuario es diferente para cada usuario.   Pero escribiendo todo esto, creo que he dado con una posible solución, no grabar el export en una ruta de usuario, sino en una en la raiz de C:, que siempre será igual para todos los usuarios, del tipo C:\Sap\export.xlsx que seria igual en todos los ordenadores. Asi sí podría decirle a PowerQuery que vaya siempre a la ruta C:\Sap\ que existirá en todos los ordenadores. Mañana intentaré hacer pruebas, aunque mi solución ideal seria que se pudiera guardar en el SharePoint. Saludos.
    • Hola La opción brindada por @torquemada es correcta, funciona, pero hay algunos inconvenientes que (desde mi punto de vista) no la convierten en mi primera elección. Los inconvenientes son: Tendrías que ir columna por columna haciendo los reemplazos, claro que no se harían a mano sino que utilizarías la opción reemplazar o la opción texto en columnas, aun asi demorará un poquito y será trabajoso. Cada vez que descargues otro listado, tendrás que volver a realizar los reemplazos. Me parece una mejor propuesta lo siguiente: Descarga los movimientos a un archivo de Excel Desde tu control de pagos (otro archivo) cargas los movimientos del archivo descargado mediante Power Query Power Query hará los reemplazos y reconocerá todo correctamente (sin que tengas que hacer nada especial) Cuando descargues los movimientos un día posterior, solamente tendrás que hacer clic en "Actualizar" y todo funcionará en automático
    • Hola a todos, Efectivamente, me temo que tal como trabajan las funciones =HOY() y/o =AHORA() (volátiles), sólo con macros puedes obtener soluciones. Un recurso pedestre podría ser, cada vez que quieras que se fije un dato, te sitúes en esa celda y pulses F2, F9 e INTRO.  Pero claro, puede ser un inconveniente si hay que hacerlo repetitivamente en muchas ocasiones,.............. en fin, lo comento sólo como posibilidad. Saludos,
  • Visualizado recientemente

    • No hay usuarios registrado para ver esta página.
×
×
  • 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.