¿Realizar varios filtrados desde un ListBox?

A tod@s!

Tengo la información en un ListBox llamado ListTablaAccionesDirigidas (granate).

Y quiero mostrar en otro ListBox llamado ListMuestraFiltrados los registros de diferentes criterios de búsqueda o filtrado obteniendo la info desde ListTablaAccionesDirigidas.

Así pues puedo filtrar:

1 Por fecha o Entre Fechas de la Fecha reunión en ListTablaAccionesDirigidas.

2 Por finalizadas o pendientes cuando dependiendo de si hay fecha en Deadline Real en ListTablaAccionesDirigidas.

3 Por personas de las que tengo en la columna Acción asignada a

Dependiendo de si elijo un filtro, dos filtros o los 3 me mostrara los valores resultantes en ListMuestraFiltrados .

Y aquí mi problema... Que no se como hacer el aplicar los filtros simultáneamente dependiendo de su elección o no.

¿Qué me aconsejáis para darle forma a esto?

2 Respuestas

Respuesta
1

Te anexo el código completo para los 3 filtros.

Al parecer las personas las tienes en un listbox con la propiedad multiselect, para poder seleccionar varias personas.

Actualiza en el código los nombres de los controles (Listbox1, TextBox y OptionButton), por los nombres de tus controles. Puse comentarios en el código para que identifiques cuáles controles actualizar.

Private Sub CommandButton1_Click()
  Dim lmf As MSForms.ListBox
  Dim i As Long, j As Long
  Dim fec As Boolean, per As Boolean
  Dim ini As Date, fin As Date
  Dim drl As Variant
  Dim dic As Object
  '
  Set dic = CreateObject("Scripting.Dictionary")
  Set lmf = ListMuestraFiltrados
  lmf.Clear
  'Validaciones
  If OptionButton1 Then 'por fecha
    With TextBox1
      If .Value = "" Or Not IsDate(.Value) Then
        MsgBox "Falta por Fecha"
        Exit Sub
      End If
      fec = True
      ini = CDate(.Value)
      fin = CDate(.Value)
    End With
  End If
  '
  If OptionButton2 Then 'entre fechas
    With TextBox2       'fecha inicial
      If .Value = "" Or Not IsDate(.Value) Then
        MsgBox "Falta Fecha Inicial"
        Exit Sub
      End If
      ini = CDate(.Value)
    End With
    With TextBox3       'fecha final
      If .Value = "" Or Not IsDate(.Value) Or ini > CDate(.Value) Then
        MsgBox "Error Fecha Final"
        Exit Sub
      End If
      fec = True
      fin = CDate(.Value)
    End With
  End If
  '
  With ListBox1 'Personas
    For i = 0 To .ListCount - 1
      If .Selected(i) Then
        per = True
        Exit For
      End If
    Next
    For i = 0 To .ListCount - 1
      If per Then
        If .Selected(i) Then dic(.List(i)) = Empty
      Else
        dic(.List(i)) = Empty
      End If
    Next
  End With
  '
  With ListTablaAccionesDirigidas
    For i = 0 To .ListCount - 1
      If fec = False Then
        ini = CDate(.List(i, 3))
        fin = CDate(.List(i, 3))
      End If
      'DeadLineReal (dlr)
      If OptionButton3 Then     'Finalizadas
        If .List(i, 5) <> "" Then drl = .List(i, 5)
      ElseIf OptionButton4 Then 'Pendientes
        drl = ""
      Else
        drl = .List(i, 5)
      End If
      'Filtro y Mostrar en ListMuestraFiltrados
      If CDate(.List(i, 3)) >= ini And CDate(.List(i, 3)) <= fin And _
         .List(i, 5) = drl And dic.exists(.List(i, 2)) Then
        lmf.AddItem .List(i, 0)
        lmf.List(lmf.ListCount - 1, 1) = .List(i, 1)
        lmf.List(lmf.ListCount - 1, 2) = .List(i, 2)
        lmf.List(lmf.ListCount - 1, 3) = Format(CDate(.List(i, 3)), "dd/mm/yyyy")
        lmf.List(lmf.ListCount - 1, 4) = Format(CDate(.List(i, 4)), "dd/mm/yyyy")
        lmf.List(lmf.ListCount - 1, 5) = Format(CDate(.List(i, 5)), "dd/mm/yyyy")
      End If
    Next
  End With
End Sub

Debes leer registro por registro y realizar las comparaciones, tal y como lo hago aquí:

'Filtro y Mostrar en ListMuestraFiltrados
      If CDate(.List(i, 3)) >= ini And CDate(.List(i, 3)) <= fin And _
         .List(i, 5) = drl And dic. Exists(. List(i, 2)) Then

O puedes llevarte los registros a una hoja de excel y aplicarles un autofiltro o un filtro avanzado y el resultado cargarlo en tu listbox.

¡Gracias!

He tardado en contestar, porque he estado depurando y adaptando a mis necesidades.

Efectivamente aplica los filtros correctamente.

Una vez más, me has dejado sorprendido de tus conocimientos y mi desconocimiento, como se suele decir, caminante se hace camino al caminar.

Muchas gracias Dante!

Respuesta

Este ejemplo le sirve como guía.

Utilizo un For Each para recorrer los controles y me apoyo en la propiedad TAG (información adicional), lo que permite en tan solo unas líneas de código hacer el filtro. Si quiere el ejemplo puede solicitarlo a [email protected] favor en el asunto anotar la consulta.

No me había percatado que su pregunta es de Excel, en este caso retiro mi respuesta. No obstante trate de migrar la información a Access, es más adecuado para manipular bases de datos.

¡Gracias!

Con Access se como hacerlo.

El problema es que muchas empresas son recelosas en usar Access, siendo mucho más potente y tratando Base de Datos que no Excel.

Sin embargo es lo que me toca.

Gracias de todas maneras!

Pero es un error en la política de la empresa manipular bases de datos en Excel y si es por licencia pueden utilizar otro gestos de base de datos de código abierto, personalmente utilizo PostgreSQL.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas