filtro listbox a piu colonne

Anonimo
2015-01-14T09:19:15+00:00

salve ragazzi,

come posso filtrare una listbox dovendo agire su due o piu colonne? ovvero

pippo   7    giallo    domani

pippo   8    verde    oggi

pluto    7    giallo    domani

pluto    8    verde    oggi

pluto    5    bianco  domani

se volessi filtrare tutti i pluto di domani

ho letto tutti i post ma sono per un filtro listbox unico o non sono riuscito a trovarlo

ora io utilizzo vari button che filtrano le colonne intere da texbox ma vorrei ampliare la ricerca

grazie per la disponibilita

massimo

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2015-01-19T08:33:36+00:00

Ciao Massimo,

la mia domanda, e scusami se a volte non mi spiego bene, è che io vorrei filtrare come da tuo esempio bella e strega che sono interne al testo, non so utilizzare il carattere jolly come si fa? perche se inserisco da sinistra i caratteri non ho nessun problema,

Esempi dell'uso del joli (*) nei criteri della TextBox1:

Per filtrare ogni valore che inizia con la lettera A, utilizza il criterio A* (oppure, a*)

Il criterio Anne è*****restituirebbe, ad esempio, Anne è bellaAnne è una brutta strega e Anne è un fan di Arsenal.

Il criterio A*strega restituirebbe  Anne è una brutta stregama non restituirebbe Anne è bella.

poi avrei bisogno di una textbox che calcoli quante righe o nomi ha filtrato tipo:

Else

Me.Textbox1.Text = .Listcount '========> ma non so dove metterlo eppoi listcount non è settato

Invece di utilizzare un'altra TextBox, vorrei suggerire l'uso di un controllo Label (Label1). Quindi, prova di sostituire il codice nel modulo della Userform con la seguente versione:

'=========>>

Option Explicit

Option Compare Text

Private rngDati As Range

'--------->>

Private Sub UserForm_Initialize()

    Dim SH As Worksheet

    Set SH = ActiveSheet

    Set rngDati = SH.Range("A1").CurrentRegion

    With Me

        .ListBox1.List = rngDati.Value

        .Label1.Caption = "Numero di Record Prima di Filtraggio = " _

                          & Me.ListBox1.ListCount - 1

    End With

End Sub

'--------->>

Private Sub cbFiltraDati_Click()

    Me.ListBox1.List = rngDati.Value

    Call filterIt

End Sub

'--------->>

Private Sub cbRipristinaDati_Click()

    Dim i As Long

    For i = 1 To 4

        Me.Controls("TextBox" & i).Value = vbNullString

    Next i

    With Me

        .ListBox1.List = rngDati.Value

        .Label1.Caption = "Numero di Record Prima di Filtraggio = " _

                          & Me.ListBox1.ListCount - 1

    End With

End Sub

'--------->>

Private Function FilterListBox(arrList As Variant, arrCriteri() As Variant)

    Dim arrIn As Variant, arrOut() As Variant, arrFilter() As Variant

    Dim i As Long, j As Long, k As Long, p As Long, q As Long

    Dim UB As Long, UB2 As Long

    Dim blMatch As Boolean

    arrIn = arrList

    UB = UBound(arrIn, 1)

    UB2 = UBound(arrIn, 2)

    For i = 0 To UB

        For j = 0 To UB2

            If CStr(arrIn(i, j)) Like arrCriteri(j + 1) Then

                blMatch = True

            ElseIf arrCriteri(j + 1) = vbNullString Then

                blMatch = True

            Else

                blMatch = False

            End If

            If Not blMatch Then

                Exit For

            End If

        Next j

        If blMatch Then

            k = k + 1

            ReDim Preserve arrFilter(1 To UB2 + 1, 1 To k)

            For p = 0 To UB2

                arrFilter(p + 1, k) = arrIn(i, p)

            Next p

        End If

    Next i

    With Me.ListBox1

        Select Case k

            Case 0

                .Clear

            Case 1

                .Column = Application.Transpose(arrFilter)

            Case Else

                .List = Application.Transpose(arrFilter)

        End Select

    End With

End Function

'--------->>

Private Sub filterIt()

    Dim arrCriteria() As Variant, arrData As Variant

    Dim sCriteri As String

    Dim i As Long, j As Long

    i = Me.ListBox1.ColumnCount

    ReDim arrCriteria(1 To i)

    For j = 1 To i

        arrCriteria(j) = Me.Controls("TextBox" & j).Value

    Next j

    sCriteri = Join(arrCriteria, ",")

    arrData = Me.ListBox1.List

    Call FilterListBox(arrData, arrCriteria())

    Me.Label1.Caption = "Numero di Record Filtrati =  " _

                        & Me.ListBox1.ListCount

End Sub

'<<=========

Troverai il file di esempio aggiornato a:  http://1drv.ms/17YcBw5

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

15 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2015-01-17T09:28:04+00:00

    Ciao Norman

    Ho annullato tutta la risposta perche sono riuscito a farlo partire una gentilezza prima che lo adatto al mio lavoro si puo filtrare inserendo anche solo parte del testo all'interno delle textbox perche cosi come è funziona solo se inserisco tutta la frase riportata nella cella eppoi se posso allungare la ricerca anche dopo la 4°colonna per esempio filtrare colonna b e colonna f

    grazie un saluto

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2015-01-15T10:31:14+00:00

    Ciao Massimo,

    Oltre agli eccellenti consigli del Mauro, se  tu dovessi desiderare effettuare il filtraggio della ListBox senza utilizzare gli strumenti forniti da Excel, potresti provare qualcosa come segue.

    Oltre ad una ListBox (ListBox1), sulla Userform inserisci quatro TextBox (TextBox1 - TextBox4) e due CommandButton, cbFiltraDati e cbRipristinaDati. Quindi, incolla il seguente codice nel modulo della Userform:

    '=========>>

    Option Explicit

    Option Compare Text

    Private rngDati As Range

    '--------->>

    Private Sub UserForm_Initialize()

        Dim SH As Worksheet

        Dim LRow As Long

        Set SH = ThisWorkbook.Sheets("Foglio1")

        With SH

            LRow = .Cells(Rows.Count, "A").End(xlUp).Row

            Set rngDati = .Range("A2:D" & LRow)

        End With

       Me.ListBox1.List = rngDati.Value

    End Sub

    '--------->>

    Private Sub cbFiltraDati_Click()

        Me.ListBox1.List = rngDati.Value

        Call filterIt

    End Sub

    '--------->>

    Private Sub cbRipristinaDati_Click()

        Me.ListBox1.List = rngDati.Value

    End Sub

    '--------->>

    Private Function FilterListBox(arrList As Variant, arrCriteri() As Variant)

        Dim arrIn As Variant, arrOut() As Variant, arrFilter() As Variant

        Dim i As Long, j As Long, k As Long, p As Long, q As Long

        Dim UB As Long, UB2 As Long

        Dim blMatch As Boolean

        arrIn = arrList

        UB = UBound(arrIn, 1)

        UB2 = UBound(arrIn, 2)

        For i = 0 To UB

            For j = 0 To UB2

                Select Case arrCriteri(j + 1)

                    Case CStr(arrIn(i, j)), vbNullString

                        blMatch = True

                    Case Else

                        blMatch = False

                End Select

                If Not blMatch Then

                    Exit For

                End If

            Next j

            If blMatch Then

                k = k + 1

                ReDim Preserve arrFilter(1 To UB2 + 1, 1 To k)

                For p = 0 To UB2

                    arrFilter(p + 1, k) = arrIn(i, p)

                Next p

            End If

        Next i

        With Me.ListBox1

            Select Case k

                Case 0

                    .Clear

                Case 1

                    .Column = Application.Transpose(arrFilter)

                Case Else

                    .List = Application.Transpose(arrFilter)

            End Select

        End With

    End Function

    '--------->>

    Private Sub filterIt()

        Dim arrCriteria() As Variant, arrData As Variant

        Dim sCriteri As String

        Dim i As Long, j As Long

        i = Me.ListBox1.ColumnCount

        ReDim arrCriteria(1 To i)

        For j = 1 To i

            arrCriteria(j) = Me.Controls("TextBox" & j).Value

        Next j

        sCriteri = Join(arrCriteria, ",")

        arrData = Me.ListBox1.List

        Call FilterListBox(arrData, arrCriteria())

    End Sub

    '<<=========

    Per filtrare i dati, inserisci i criteri di filtraggio nelle 4 TextBox e premi il CommandButton cbFiltraDati; Le quattro TextBox corrispondono alle 4 colonne di dati.

    Per eseguire un successivo filtraggio subordinato dei dati filtrati, immetti i criteri richiesti nelle caselle di testo e premi nuovamente il CommandButton cbFiltraDati. Per ripristinare i dati iniziali, premi il CommandButton cbRipristinaDati.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2015-01-14T15:46:37+00:00

    Ciao Mauro,

    si in effetti ho fatto alcune prove con il filtro ed è proprio ciò che cerco ma poi come lo gestisco? da foglio o da userform?

    se da foglio non sono capace a riportarlo nella listbox

    se da userform  non sono capace a mettere più di un filtro come da tua filtrolistbox

    se faccio una macro e attivo i filtri non sono capace a mettere le variabili

    insomma aiutami almeno a capire

    se parto dal tuo filtrolistbox dovrei avere due listbox e rifiltrarle nella seconda ma mi sembra na pacchianata e non saprei come fare

    nel forum nessuno ha avuto la stessa mia richiesta o non lo trovata

    che fo?

    ciao e grazie

    massimo

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2015-01-14T10:56:19+00:00

    salve ragazzi,

    come posso filtrare una listbox dovendo agire su due o piu colonne? ovvero

    <cut>

    La cosa è fattibile e in diversi modi. Ma sempre tenendo ben presente che di default la Listbox non ha strumenti adatti. Immagino che tu debba poi ripristinare la Listbox senza filtri. Ma non fai prima a *filtrare* la tabella sul foglio e caricare nella Listbox quanto filtrato? Il foglio ha tutto quello che serve per filtrare/ordinare. Pensaci su un attimo... ;-)

    La risposta è stata utile?

    0 commenti Nessun commento