Problema para añadir datos a un Combo vinculado a otro Combo

Tengo un problema con este código VBA. Tengo 2 ComboBox. El primero lo relleno recorriendo una rango en otra hoja y evitando los duplicados. El otro ComboBox hago lo mismo, pero quiero que solo se rellene teniendo en cuenta los datos que utilizo que están en la columna de al lado de donde cojo los de Combo y que sean iguales al ComboBox1. De momento los datos del ComboBox1 se sacan de la columna "G" y los del ComboBox2 de la columna "H", sin tener en cuenta su vinculación.

Código ComboBox1

Sub LlenarComboBox1()
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
'
Dim rango As Range
Set a = Sheets("Listado OT")
Set k = Sheets("AnalisisCUEX")
'
k.ComboBox1.Clear
For Each celda In a.Range("G5:G" & a.Range("G65000").End(xlUp).Row)
If InStr(valores, celda) = 0 Then
valores = valores & "," & celda.Value
End If
Next
valores = Mid(valores, 2, Len(valores) - 1)
valores = Split(valores, ",")
For x = 0 To UBound(valores)
k.ComboBox1.AddItem valores(x)
Next
k.Range("A1").Select
'+++ ahora ordenamos el combo ++++++++++++++++++++++
Set lista = CreateObject("System.Collections.ArrayList")
For x = 0 To k.ComboBox1.ListCount - 1
lista.Add k.ComboBox1.List(x)
Next
lista.Sort
k.ComboBox1.Clear
For Each Z In lista
k.ComboBox1.AddItem Z
Next
'
Application.ScreenUpdating = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
End Sub

Código del ComboBox2

Sub LlenarComboBox2()
Application.ScreenUpdating = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False
'
Dim rango As Range
Set a = Sheets("Listado OT")
Set k = Sheets("AnalisisCUEX")
'
k.ComboBox2.Clear
For Each celda In a.Range("H5:H" & a.Range("H65000").End(xlUp).Row)
If InStr(valores1, celda) = 0 Then
valores1 = valores1 & "," & celda.Value
End If
Next
valores1 = Mid(valores1, 2, Len(valores1) - 1)
valores1 = Split(valores1, ",")
For x = 0 To UBound(valores1)
k.ComboBox2.AddItem valores1(x)
Next
k.Range("A1").Select
'
Application.ScreenUpdating = True
Application.EnableEvents = True
ActiveSheet.DisplayPageBreaks = True
Application.CutCopyMode = False
End Sub

1 respuesta

Respuesta
1

Prueba con esta macro

Sub llenar_combo1()
inicio = Time
Dim unicos As New Collection
Set a = Worksheets("listado ot")
Set k = Worksheets("analisiscuex")
Set datos = a.Range("g5").CurrentRegion
Set lista = CreateObject("System.Collections.ArrayList")
With datos
    f = .Rows.Count
    .Sort key1:=a.Range(.Columns(1).Address), order1:=xlAscending
    k.ComboBox1.Clear
    For i = 1 To f
        numero = .Cells(i, 1)
        On Error Resume Next
            unicos.Add numero, CStr(numero)
            If Err.Number = 0 Then k.ComboBox1.AddItem numero
        On Error GoTo 0
    Next i
    Set datos = Nothing: Set lista = Nothing
End With
fin = Time
tiempo = fin - inicio
MsgBox ("completado en " & Second(tiempo) & " segundos"), vbInformation, "AVISO"
End Sub
Sub llena_combo2()
Set a = Worksheets("listado ot")
Set k = Worksheets("analisiscuex")
Set datos = a.Range("g5").CurrentRegion
numero = Val(k.ComboBox1.Value)
With datos
    cuenta = WorksheetFunction.CountIf(.Columns(1), numero)
    fila = WorksheetFunction.Match(numero, .Columns(1), 0)
    a.Range(.Cells(fila, 2).Resize(cuenta).Address).Name = "numeros"
    k.ComboBox2.ListFillRange = "numeros"
End With
Set datos = Nothing
End Sub

Hola James, gracias.

Me funciona solo la primera macro. Le he modificado los nombres de las hojas y el orden de la columna que era la 7. La he dejado así y se rellena bien el Combo.

Sub llenar_combo1()
inicio = Time
Dim unicos As New Collection
Set a = Worksheets("Listado OT")
Set k = Worksheets("AnalisisCuex")
Set datos = a.Range("g5").CurrentRegion
Set lista = CreateObject("System.Collections.ArrayList")
With datos
    f = .Rows.Count
    .Sort key1:=a.Range(.Columns(7).Address), order1:=xlAscending
    k.ComboBox1.Clear
    For i = 2 To f
        numero = .Cells(i, 7)
        On Error Resume Next
            unicos.Add numero, CStr(numero)
            If Err.Number = 0 Then k.ComboBox1.AddItem numero
        On Error GoTo 0
    Next i
    Set datos = Nothing: Set lista = Nothing
End With
fin = Time
tiempo = fin - inicio
MsgBox ("completado en " & Second(tiempo) & " segundos"), vbInformation, "AVISO"
End Sub

La segunda macro me da error en la fila siguiente y se detiene la macro.

fila = WorksheetFunction.Match(numero, .Columns(1), 0). Me sale un error de "No se puede obtener la propiedad Match de la clase WorksheetFunction"

Sub llenar_combo2()
Set a = Worksheets("Listado OT")
Set k = Worksheets("AnalisisCuex")
Set datos = a.Range("g5").CurrentRegion
numero = Val(k.ComboBox1.Value)
With datos
    cuenta = WorksheetFunction.CountIf(.Columns(1), numero)
    fila = WorksheetFunction.Match(numero, .Columns(1), 0)
    a.Range(.Cells(fila, 2).Resize(cuenta).Address).Name = "numeros"
    k.ComboBox2.ListFillRange = "numeros"
End With
Set datos = Nothing
End Sub

Te agradezco si me puedes ayudar.

Moisés.

James, en la segunda macro he modificado esto para que lo tengas en cuenta.

Sub llenar_combo2()
Set a = Worksheets("Listado OT")
Set k = Worksheets("AnalisisCuex")
Set datos = a.Range("h5").CurrentRegion
numero = (k.ComboBox1.Value)
With datos
    cuenta = WorksheetFunction.CountIf(.Columns(7), numero)
    fila = WorksheetFunction.Match(numero, .Columns(1), 0)

Set datos = a.Range("h5").CurrentRegion 'he modificado la columna G por la H que es donde están los datos a rellenar. La columna G era en el Combo1. No se si he hecho bien.

numero = (k.ComboBox1.Value) 'he quitado el Val antes del paréntesis porque el valor daba 0 ya que lo que busca no son números. Con el F8 he visto que así encontraba el valor mientras que antes daba 0.

cuenta = WorksheetFunction.CountIf(.Columns(7), numero) 'aquí he cambiado el 1 por el 7, ya que los valores que busca vincular están en la columna "G".

No se si lo que he hecho está bien del todo, he intentado adaptar la macro entendiendo el funcionamiento, puede que no lo haga bien por eso te lo indico.

Pero el error me sigue saliendo en el mismo lugar que antes.

Quedo a la espera si me puedes ayudar.

Gracias James.

Para que tengas mas datos te envío la tabla de donde deberían salir los Combo.


El primer Combo sale de la columna G y el segundo de la columna H. 

Los datos están a partir de la fila 5, porque la 4 son los títulos.

El primer Combo ya lo hace bien pero el segundo es el que da el fallo porque no encuentra los valores imagino.

Gracias,

Moisés.

James, perdona sea tan pesado. Voy haciendo pruebas dentro de mis limitaciones en VBA y por eso te escribo tan seguido.

Mira, con este código que es modificando el tuyo ya salen los datos, pero en el Combo2 se repiten y lo que necesito es que la lista "numeros" contenga valores únicos. Ya creo que queda poco para acabar para que funcione bien, pero que no se repitan no se como hacerlo.

Código:

Sub llenar_combo2()
Set a = Worksheets("Listado OT")
Set k = Worksheets("AnalisisCuex")
Set datos = a.Range("h5").CurrentRegion
numero = (k.ComboBox1.Value)
With datos
    cuenta = WorksheetFunction.CountIf(.Columns(7), numero)
    fila = WorksheetFunction.Match(numero, .Columns(7), 0)
    a.Range(.Cells(fila, 8).Resize(cuenta).Address).Name = "numeros"
    k.ComboBox2.ListFillRange = "numeros"
End With
Set datos = Nothing
End Sub

Foto:

Muchas gracias, y por tu paciencia.

Moisés.

La respuesta a tu pregunta sobre el 2o combobox esta a la vista en el 1er combobox, mira el código y veras que es así con alguna mínima variación.

Sub llena_combo2()
Dim unicos As New Collection
Set a = Worksheets("listado ot")
Set k = Worksheets("analisiscuex")
Set datos = a.Range("g5").CurrentRegion
actividad = k.ComboBox1.Value
With datos
cuenta = WorksheetFunction.CountIf(.Columns(7), actividad)
fila = WorksheetFunction.Match(actividad, .Columns(7), 0)
Set registros = .Cells(fila, 8).Resize(cuenta, 1)
k.ComboBox2.Clear
For i = 1 To cuenta
contrato = .Cells(fila, 8)
On Error Resume Next
unicos.Add contrato, CStr(contrato)
If Err.Number = 0 Then k.ComboBox2.AddItem contrato
On Error GoTo 0
Next i
End With
Set datos = Nothing: Set registros = Nothing
End Sub

¡Gracias! Pero no acaba de funcionar bien. La segunda macro me rellena el ComboBox2 solo con el primer dato coincidente de la columna "H" que es la 8, no me da posibilidad de elegir mas. Sin embargo el primer Combo me rellena con todas los datos de la columna "G" no repetidos. Veo que en el código del primer Combo hay un Array que no hay en el segundo. No consigo ver cómo hacerlo en este segundo Combo.

Envío el código completo a ver si me podéis ayudar por favor. os lo agradezco sinceramente.

Sub llenar_combo1()
'inicio = Time
Dim unicos As New Collection
Set a = Worksheets("Listado OT")
Set k = Worksheets("AnalisisCuex")
Set datos = a.Range("g5").CurrentRegion
Set lista = CreateObject("System.Collections.ArrayList")
With datos
    f = .Rows.Count
    .Sort key1:=a.Range(.Columns(7).Address), order1:=xlAscending
    k.ComboBox1.Clear
    For i = 2 To f
        numero = .Cells(i, 7)
        On Error Resume Next
            unicos.Add numero, CStr(numero)
            If Err.Number = 0 Then k.ComboBox1.AddItem numero
        On Error GoTo 0
    Next i
    Set datos = Nothing: Set lista = Nothing
End With
fin = Time
'tiempo = fin - inicio
'MsgBox ("completado en " & Second(tiempo) & " segundos"), vbInformation, "AVISO"
End Sub
'llenar el segundo comboBox
Sub llenar_combo2()
Dim unicos As New Collection
Set a = Worksheets("Listado OT")
Set k = Worksheets("AnalisisCuex")
Set datos = a.Range("g5").CurrentRegion
actividad = k.ComboBox1.Value
With datos
cuenta = WorksheetFunction.CountIf(.Columns(7), actividad)
fila = WorksheetFunction.Match(actividad, .Columns(7), 0)
Set registros = .Cells(fila, 8).Resize(cuenta, 1)
k.ComboBox2.Clear
For i = 1 To cuenta
contrato = .Cells(fila, 8)
On Error Resume Next
unicos.Add contrato, CStr(contrato)
If Err.Number = 0 Then k.ComboBox2.AddItem contrato
On Error GoTo 0
Next i
End With
Set datos = Nothing: Set registros = Nothing
End Sub

Moisés.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas