¿Cómo puedo eficientar filtro en un combobox?

Expertos en excel, quisiera pedir un poco de su ayuda para la solución de un tema un poco complicado para mi.

En un libro de excel tengo 3 hojas (entradas, salidas y devoluciones), el form se llena con datos de la hoja entradas y debe descargar su información en las hojas "salidas y devoluciones" respectivamente. El combobox1 carga aquellos datos que no contengan información en la columna 10, es decir en la columna J. Al mismo tiempo se rellenan los textboxs 1,2,8. Mi petición es que me puedan ayudar a obtener un código diferente al que tengo, uno mas eficiente, es que por alguna razón siempre me esta marcando error de la clase worksheetFunction, y la verdad me gustaría poder contar con un código diferente a este. Espero me puedan ayudar amigos. De ante mano muchas gracias.

Private Sub UserForm_Initialize()

'carga rango del combobox1 e indica la cantidad de columnas que desea vaciar a los textboxs
Sheets("ENTRADAS"). Unprotect
Dim uf As Long
Dim cel As Range
With Sheets("ENTRADAS")
uf = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A8:M" & uf).AutoFilter 10, ""
ComboBox1.Clear
For Each cel In .Range("A9:A" & uf).SpecialCells(xlCellTypeVisible)
ComboBox1.AddItem cel.Value
Next
.Range("A8:M" & uf).AutoFilter
End With
Sheets("DEVOLUCIONES A PROVEEDOR").Select
ComboBox1.SetFocus

End Sub

Private Sub ComboBox1_Change()

Dim i As Variant
Dim x As Variant
Dim j As Variant
i = ComboBox1
With Sheets("ENTRADAS")
j = .Range("A" & Rows.Count).End(xlUp).Row
x = WorksheetFunction.Match(i, .Range("A1:A" & j), 0) 'AQUÍ ES DONDE SIEMPRE ME MARCA ERROR
'NO CARGA TEXTBOXS AL EJECUTAR FORM
TextBox1 = .Cells(x, 2) 'COLOR
TextBox2 = .Cells(x, 3) 'DESCRIPCIÓN
TextBox8 = .Cells(x, 11) 'SALDO
'TEXTBOXS 3,4,5,6 SE INTRODUCEN A MANO
'COMBOBOX2 SE CARGA AUTOMÁTICO
' TEXTBOX 1,2,3,4,5,6 Y COMBOBOX1,2, SE VACÍAN EN 2 HOJAS, SALIDAS Y DEVOLUCIONES EN SUS RESPECTIVAS CELDAS
End With

End Sub

1 respuesta

Respuesta
1

Cambia el código de tu combobox por esto:

 
Private Sub ComboBox1_Change()
'Mod.Por.DAM
    With Sheets("ENTRADAS")
        Set b = .Range("A:A").Find(ComboBox1)
        If Not b Is Nothing Then
            TextBox1 = .Cells(b.Row, 2) 'COLOR
            TextBox2 = .Cells(b.Row, 3) 'DESCRIPCIÓN
            TextBox8 = .Cells(b.Row, 11) 'SALDO
            'TEXTBOXS 3,4,5,6 SE INTRODUCEN A MANO
            'COMBOBOX2 SE CARGA AUTOMÁTICO
            ' TEXTBOX 1,2,3,4,5,6 Y COMBOBOX1, 2, SE VACÍAN EN 2 HOJAS, SALIDAS Y DEVOLUCIONES EN SUS RESPECTIVAS CELDAS
        End If
    End With
End Sub

Saludos. no olvides finalizar

Hola Dam, antes que nada gracias por responder. Sobre tu respuesta, me parece muy buena, solo un detalle. En el combo digamos que tengo códigos como estos; 1000,1001,1002,.....,x. Con tu solución busca correctamente, pero si un código se repite es cuando pierde un poco el sentido. Digo esto porque digamos que el form se ejecuta y elijo el código 1000, los textboxs se completan correctamente, pero si tengo mas abajo otro código igual, es decir otro 1000 , la información del primero coincide con el segundo 1000 y esta es la falla.Saludos y muchas gracias.

Paulo G.

Entonces tenemos que decirle al programa cuál de todos los repetidos es el que necesitas, para eso tenemos que indicarle otra característica, es decir, cuál es la diferencia entre esos códigos repetidos.

Dime cuál es esa característica y te ayudo con el programa.

Hola de nuevo, como una aclaración informo que había encontrado una forma de hacer lo que te comento anteriormente, solo que tuve que ir modificando día a día el formulario hasta llegar al punto que me encuentro hoy en dia. El siguiente es él código del que hablo:

Private Sub UserForm_Initialize()
Dim u As Long
With Sheets("ENTRADAS")
u = .Range("A50000").End(xlUp).Row
ComboBox1.List = .Range("A1:B" & u).Value
End With
End Sub
Private Sub ComboBox1_Change()
Dim i As Long
i = ComboBox1.ListIndex
If i = -1 Then
TextBox1.Value = Empty
Else
TextBox1.Value = ComboBox1.Column(1, i)

TextBox2.Value = ComboBox1.Column(2, i)

TextBox8.Value = ComboBox1.Column(8, i) 'aquí fallaba puesto que el textbox tenía que ser consecutivo con el numero de columna. Por ello opten por el reciente código.
End If
End Sub

Cito nuevamente como aclaración; ¿sería posible de hacer un híbrido de ambos códigos para cumplir con la necesidad?, ó, ¿Forzosamente tengo que anexar un numero de identificación única para para que el combobox llene correctamente los textboxs?

De ser la ultima opción el dato de identificación única estaría ubicado en la columna N

Gracias por la atención, saludos.

Paulo G.

Solamente estoy siguiendo lo que me pides, tenías un error en la búsqueda y eso fue lo que te corregí. Ahora estás cargando de otra forma el combobox1, significa que en el item 0 del combobox1 tendrás el dato de la fila 1, en el item 1 del combo tendrás el dato de la fila 2, y así sucesivamente. Por eso en la macro al valor de i le estoy sumando un 1.

La secuencia de datos funciona cuando no tienes filtros al momento de cargar los datos en el combo. Es decir, en el primer código que me enviaste tenías un filtro, cuando pones un filtro, entonces puede ser que el dato de la fila 5 quede en el item 0 del combo, el dato de la fila 7 quede en el item 2, etc. Es por eso que si pones un filtro tendrás que buscar por un identificador único. Si no pones filtro entonces podemos asumir cuál número de fila está en cual item del combo.

Prueba con esto:

Private Sub UserForm_Initialize()
    Dim u As Long
    With Sheets("ENTRADAS")
        u = .Range("A50000").End(xlUp).Row
        ComboBox1.List = .Range("A1:B" & u).Value
    End With
End Sub
Private Sub ComboBox1_Change()
    Dim i As Long
    i = ComboBox1.ListIndex + 1
    If i = -1 Then
        TextBox1.Value = Empty
    Else
        With Sheets("ENTRADAS")
            TextBox1.Value = .Cells(i, 2)
            TextBox2.Value = .Cells(i, 3)
            TextBox8.Value = .Cells(i, 11)
        End With
    End If
End Sub

Hola Dam. Gracias por tu ayuda, siento decir esto, pero no es lo que busco, a lo que me refería era a que si había una posibilidad de que con el código en el que existe el filtro se pudiese buscar correctamente la información correcta aunque hubiese repetidos, verás:

el primer código que puse me hace un filtrado que es bastante importante, el problema es que no busca la información correcta si existen códigos duplicados en el combobox, es decir; (Ejemplo hipotético)

Combobox1 = código Textbox1= cantidad

código cantidad

1000 500

1001 150

1000 1200

Lo que el primer código haría siendo el form ejecutado, sería que al momento de clickear el primer "1000", en el textbox1 arrojaría 500, pero al momento de elegir el segundo "1000", me seguiría arrojando en el textbox1 500, siendo que lo correcto sería arrojar 1200.

en el segundo código que puse pasa lo contrario;

Combobox1 = código Textbox1= cantidad

código cantidad

1000 500

1001 150

1001 1200

Lo que este segundo código hace es que si elijes el primer "1000", en el textbox1 arroja 500, y si elijes el segundo"1000", arroja 1200, pero no tiene el filtro del que hablo en el primer código y que es muy necesario.

A lo que me refería con crear un híbrido, era que si existía una posibilidad de conjuntar ambos código para que se cumplieran las dos condiciones a la vez;

1.- que ocurriera el filtrado

2.- que llamara los datos correctos a los textboxs aunque hubiese duplicados en el combobox1.

No sé se me haya explicado bien, pero de antemano dejame decir que agradezco cada lectura y tiempo que haz tomado para responder a mis dudas. Un gran saludo desde México

Paulo G.

Este sería el "híbrido", estoy almacenando en el combobox1 en la columna 0 el valor y en la columna 1 del combobox1 el número de fila, de esta forma cuando selecciones un dato del combo, en la columna 1 del combo tenemos el número de fila y así podemos leer los datos de la hoja.

Private Sub UserForm_Initialize()
'Mod.Por.DAM
    With Sheets("ENTRADAS")
        uf = .Range("A" & .Rows.Count).End(xlUp).Row
        .Range("A8:M" & uf).AutoFilter 10, ""
        ComboBox1.Clear
        For Each cel In .Range("A9:A" & uf).SpecialCells(xlCellTypeVisible)
            ComboBox1.AddItem cel.Value
            ComboBox1.List(ComboBox1.ListCount - 1, 1) = cel.Row
        Next
        .Range("A8:M" & uf).AutoFilter
    End With
End Sub
Private Sub ComboBox1_Change()
'Por.DAM
    i = ComboBox1.List(ComboBox1.ListIndex, 1)
    With Sheets("ENTRADAS")
        TextBox1 = .Cells(i, 2)
        TextBox2 = .Cells(i, 3)
        TextBox8 = .Cells(i, 11)
    End With
End Sub

Excelso Dam, muchas gracias por el tiempo dedicado. Lamento mucho si te cause muchas molestias, nuevamente agradezco tu tiempo, esfuerzo y amabilidad. Saludos.

Paulo G.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas