Tres ComboBox relacionados entre si con ingreso de datos

Feliz Navidad!

Quisiera consultarte si puedes ayudarme con un código que desde un Userform maneja 3 ComboBox relacionados entre si, es decir que ingresado un valor en uno de ellos leído de la Hoja1 columna A, el ComboBox 2 se completa automáticamente con datos de la Hoja2 Columna B y el ComboBox 3 con datos de la Hoja3 Columna C. Hasta aquí debo decir que, buscando bien, hay algunos ejemplos pero mi consulta va a la siguiente característica: necesito poder ingresar datos en cualquiera de ellos y que se completen automáticamente los demás y es aquí donde tengo problemas.

¿Podrías ayudarme con algún ejemplo?

Un abrazo y desde ya

1 respuesta

Respuesta
2

Revisa el siguiente ejemplo para 2, intenta adaptarlo a 3

Dim h1
'
Private Sub ComboBox1_Change()
    cargar 2
End Sub
'
Private Sub ComboBox2_Change()
    cargar 3
End Sub
'
Private Sub UserForm_Activate()
'Por.Dante Amor
    Set h1 = Sheets("Base de datos")
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        agregar ComboBox1, h1.Cells(i, "A")
    Next
End Sub
'
Sub agregar(combo As ComboBox, dato As String)
'Por.Dante Amor
    For i = 0 To combo.ListCount - 1
        Select Case StrComp(combo.List(i), dato, vbTextCompare)
            Case 0: Exit Sub
            Case 1: combo.AddItem dato, i: Exit Sub
        End Select
    Next
    combo.AddItem dato
End Sub
'
Sub cargar(ini)
'Por.Dante Amor
    For i = ini To 3
        Controls("ComboBox" & i).Clear
    Next
    For i = 2 To h1.Range("A" & Rows.Count).End(xlUp).Row
        For j = 1 To ini - 1
            valor = IIf(IsNumeric(Controls("ComboBox" & j)), _
                Val(Controls("ComboBox" & j)), Controls("ComboBox" & j))
            If h1.Cells(i, j) = valor Then
                igual = True
            Else
                igual = False
                Exit For
            End If
        Next
        If igual Then agregar Controls("ComboBox" & ini), h1.Cells(i, ini)
    Next
End Sub

¡Gracias Dante!

Me tomare hasta mañana para valorarla pues seguramente tendré alguna duda y si cierro ahora......

Abrazo

No te preocupes, terminamos el código hasta que te funcione.

Los datos deben empezar en la columna A y en la fila 2.

Hola Dante, Feliz Año 2017!

Deje por mail privado una aclaración sobre lo respondido.

Agradezco mucho tu predisposición de siempre

Daniel.

Te anexo el código, si cambias el combo1 o el combo2 o el combo3, en automático se llenan los otros combos

Dim cargando
Private Sub ComboBox1_Change()
    Call LlenarCombos(ComboBox1, ComboBox2, ComboBox3)
End Sub
Private Sub ComboBox2_Change()
    Call LlenarCombos(ComboBox2, ComboBox1, ComboBox3)
End Sub
Private Sub ComboBox3_Change()
    Call LlenarCombos(ComboBox3, ComboBox1, ComboBox2)
End Sub
'
Sub LlenarCombos(p As ComboBox, s As ComboBox, t As ComboBox)
    If cargando Then Exit Sub
    cargando = True
    s.Value = ""
    t.Value = ""
    If p.ListIndex = -1 Then cargando = False: Exit Sub
    s = ComboBox2.List(p.ListIndex)
    t = ComboBox3.List(p.ListIndex)
    cargando = False
End Sub
'
Private Sub UserForm_Activate()
    For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
        ComboBox1.AddItem Cells(i, "A")
        ComboBox2.AddItem Cells(i, "B")
        ComboBox3.AddItem Cells(i, "C")
    Next
End Sub

sal u dos

¡Gracias Dante!

Excelente respuesta

Tratare de adaptarla ya que, como dice la consulta original, cada como lee hojas distintas...

Un fuete abrazo

DC

Te anexo el código

Private Sub Obra_Change()
    Call LlenarCombos(Obra, Empresa, NomCorto, "A", "B", "C")
End Sub
Private Sub Empresa_Change()
    Call LlenarCombos(Empresa, Obra, NomCorto, "B", "A", "C")
End Sub
Private Sub NomCorto_Change()
    Call LlenarCombos(NomCorto, Obra, Empresa, "C", "A", "B")
End Sub
Sub LlenarCombos(p As ComboBox, s As ComboBox, t As ComboBox, c1, c2, c3)
    If cargando Then Exit Sub
    cargando = True
    s.Value = ""
    t.Value = ""
    If p.ListIndex = -1 Then cargando = False: Exit Sub
    Set h = Sheets("OBRAS-EMPRESAS")
    Set b = h.Columns(c1).Find(p.Value, lookat:=xlWhole)
    If Not b Is Nothing Then
        s = h.Cells(b.Row, c2)
        t = h.Cells(b.Row, c3)
    End If
    cargando = False
End Sub
La pregunta no admite más respuestas

Más respuestas relacionadas