Cargar registros visibles en Listbox de Excel

Favor puedan ayudarme, estoy creando un pequeño excel donde abro un userform en el cual es como un cardex de identidad, estoy intentando y no he podido, al escribir en mi textbox1 un código, mi tabla excel se filtra y lo que no he podido es que los datos filtrados se cargen a mi listbox tal como están filtrados.

Cuando escribo en mi rowsource del Listbox1 el rango, me carga toda la tabla hasta el ultimo dato existente y no quiero eso, lo que quiero es que me muestre los datos que quedaron al filtrar la tabla, por ejemplo la tabla tiene 100 registros de empleados de una empresa, estoy buscando un empleado especifico que sucede que tiene 3 veces registrados (repetido) porque sucede que este empleado tiene un historial de haber renunciado y vuelto a la empresa en 3 ocasiones, por lo tanto al filtrarlo me aparece 3 registros en mi tabla pero en mi listbox me aparecen los 100 registros. Espero haberme explicado bien, pero mejor aun alguien pueda ayudarme.

1 respuesta

Respuesta
1

Rowsource no funciona así, para que rowsource pueda funcionar necesita tener todos los datos seguidos es decir a1, a2, a3, a4, etc, al aplicar un filtro los datos te quedan así a1, a5, 10, a35 como ves están salteados y entonces es cuando rowsource falla, o hago seguido filtros de este tipo solo que de otra manera mira la imagen, como ves solo cargo los registros del empleado 1002 en el listbox, si te sirve esto el código se encuentra abajo en realidad son muy pocas líneas.

y este es el código, solo tecleas el numero en el textbox y das enter.

Private Sub TextBox1_AFTERUPDATE()
Dim FUNCION As WorksheetFunction
Set DATOS = Range("EMPLEADOS")
Set FUNCION = WorksheetFunction
ID = Val(TextBox1.Text)
With DATOS
    CUENTA = FUNCION.CountIf(.Columns(1), ID)
    VALIDA = CUENTA = 0
    If VALIDA Then GoTo SAL:
    FILA = FUNCION.Match(ID, .Columns(1), 0)
    MATRIZ = .Rows(FILA).Resize(CUENTA)
    With ListBox1
        .List = MATRIZ
        .ColumnCount = DATOS.Rows.Count
        Label3 = .ListCount
    End With
End With
SAL:
End Sub
Private Sub UserForm_Activate()
With UserForm1
    .Caption = "MODULO DE EMPLEADOS"
    .Move 150, 12
End With

Saludos, Estimado,

Primeramente agradecerle por su pronta respuesta y ayuda, ya adapte los codigos que me envió y comentarle que no me funciona como se ve que a usted le funciona, a diferencia de sus registros en celdas excel, mi registros son en tabla Excel, mi tabla la he llamado "BDRegistro", los demas datos los adapte, por ejemplo el ID que usted utiliza, para mi caso es mi CI, en si, este tema es lo de menos supongo, pero no se si algo estoy adaptando mal, en el caso de su rango de empleado no lo hize asi porque en mi caso mi tabla ira creciendo cada registro nuevo, y en el caso suyo, el rango empleado esta bien para un ejemplo pero no para trabajo diario, o quizas entendi mal, en si, lo que hize fue modificar el rango "Empleado" codigo suyo por el rango de mi columna F, columna donde tengo mis CI (para usted ID), entonces enves de "Empleados" puse "F2:F24", en resumen su codigo me quedo asi:

Private Sub TextBox1_Change()
Dim FUNCION As WorksheetFunction
Set DATOS = Range("F2:Y24")
Set FUNCION = WorksheetFunction
ID = Val(TextBox1.Text)
With DATOS
CUENTA = FUNCION.CountIf(.Columns(6), CI)
VALIDA = CUENTA = 0
If VALIDA Then GoTo SAL:
Fila = FUNCION.Match(CI, .Columns(6), 0)
MATRIZ = .Rows(Fila).Resize(CUENTA)
With ListBox1
.List = MATRIZ
.ColumnCount = DATOS.Rows.Count
Label3 = .ListCount
End With
End With
SAL:
End Sub

Private Sub UserForm_Activate()

With UserForm7
.Caption = "MODULO DE EMPLEADOS"
.Move 150, 12
End With
End Sub

Aqui en la orden de USERFORM ACTIVATE, agrege el "End With", porque sin el cierre no me lanzaba el userform, me salia error, por eso lo agrege y ya lanzó. Favor si puede coregirme en que parte estoy haciendo mal, porque segun su foto, si logro hacer lo que usted le funciona, eso me servira de mucho. Le adjunto una captura de mi tabla.

Saludos cordiales,

Rubén

Veamos la orden set que no usaste es el corazón de la macro y al igual que una tabla esta configurado para adaptarse a la información que añadas o quites, respecto a tu tabla BDREGISTRO esta es el equivalente a una orden set así que facilita bastante la programación y ya con tus datos reales el resultado es lo que ves en la imagen, la macro sigue funcionando igual tu tecleas el CI en el textbox, la macro hace un ordenamiento de datos basado en la columna CI, cuenta cuantos registros coinciden con la ID, buscan el primer registro que coincide y a partir de esa fila carga todos los datos que coinciden en el listbox.

y este es el codigo modificado

Private Sub TextBox1_AfterUpdate()
Dim FUNCION As WorksheetFunction
Set FUNCION = WorksheetFunction
Set empleados = Range("BDREGISTRO")
CI = Val(TextBox1.Text)
With empleados
    CUENTA = FUNCION.CountIf(.Columns(6), CI)
    VALIDA = CUENTA = 0
    If VALIDA Then GoTo SAL
    FILA = FUNCION.Match(CI, .Columns(6), 0)
    matriz = .Rows(FILA).Resize(CUENTA)
End With
With ListBox1
    .Clear
    .List = matriz
    .ColumnCount = empleados.Columns.Count
    Label2 = .ListCount
End With
Erase matriz: Set empleados = Nothing
SAL:
End Sub
Private Sub UserForm_Activate()
With UserForm1
    .Caption = "MODULO DE EMPLEADOS"
    .Move 150, 12
End With
End Sub
Private Sub UserForm_Initialize()
Set empleados = Range("BDREGISTRO")
With empleados
    .Sort KEY1:=Range(.Columns(6).Address), ORDER1:=xlAscending, Header:=xlYes
End With
Set empleados = Nothing
End Sub

Estimado,

Funciona perfectamente, acabo de realizar mi votación, agradecido por su ayuda, muy buenos datos e inmediata ayuda.

Saludos cordiales,

Rubén

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas