jueves, 21 de diciembre de 2017

VBA: Filtrar en un ListBox

Veremos una manera rápida y ágil de mostrar elementos coincidentes similares en un ListBox a partir de un valor introducido en un TextBox.
Ya vimos algo similar en este post, pero en esta ocasión emplearemos las Array en nuestro código para agilizar el traspaso de información...

Nuestros datos en una hoja llamada 'Datos' y un rango A1:C11:

VBA: Filtrar en un ListBox



Nuestro formulario, reducido a lo necesario, tendrá:
1- un TextBox llamado 'TxtFiltro'
2- un ListBox llamdao 'ListFiltro'


Así pues añadimos la siguiente macro dentro de la ventana de código de nuestro UserForm en nuestro proyecto de VB:

Private Sub TxtFiltro_Change()
Dim myList() As Variant
Dim X As Long, Y As Long
Dim coincidencia As Boolean
coincidencia = False
Y = 0
'replicamos un filtro a visualizar sobre el ListBox
For X = 2 To Sheets("Datos").Range("A" & Rows.Count).End(xlUp).Row
    If InStr(1, UCase(Sheets("Datos").Range("B" & X).Value), UCase(Me.TxtFiltro.Value)) > 0 Then
        coincidencia = True
        ReDim Preserve myList(2, Y)
        'cargamos nuestra matriz....
        myList(0, Y) = Sheets("Datos").Range("A" & X).Text
        myList(1, Y) = Sheets("Datos").Range("B" & X).Text
        myList(2, Y) = Sheets("Datos").Range("C" & X).Text
        Y = Y + 1
    End If
Next
'si hemos localizado alguna coincidencia...
If coincidencia = True Then
    'mostramos datos coincidentes cargados en nuestra Array
    Me.ListFiltro.List = Application.Transpose(myList)
Else
    Me.ListFiltro.Clear
End If
End Sub
 
Private Sub UserForm_Activate()
Dim var As Variant
'cargamos en una Array el rango de datos...
With Sheets("Datos")
    var = .Range("A2:C" & .Range("A" & Rows.Count).End(xlUp).Row).Value
End With
With Me.ListFiltro
    .ColumnCount = 3 'indicamos número columnas
    .ColumnWidths = "50;50;50" 'determinamos ancho...
    If Not IsEmpty(var) Then
        'si hay datos vaciamos el ListBox
        .Clear
        .List = var
    End If
End With
End Sub



Además del uso de Array, y para compensar el desconocimiento a priori del número de registros coincidentes, hacemos de nuevo uso de la definición de tamaño de una Array, empleando ReDim Preserve, que nos habilita la opcíon de incorporar nuevos registros de manera 'ilimitada' manteniendo los datos cargados.
Esta técnica evita los conteos previos de coincidencias...


Al ejecutar el UserForm comprobaremos cómo a medida escribimos en el TextBox, el filtro se muestra directamente sobre los elementos del campo 'Concepto', tal como buscábamos.

No hay comentarios:

Publicar un comentario