Excel VBA: Filtro automatico

Anonimo
2020-11-04T09:33:17+00:00

Ho un problema nel trattamento del "filtro automatico" in Excel con VBA. Una semplice colonna con alcune date (in formato Tabella), attivo "Registrazione macro", clicco sul filtro automatico per selezionare un intervallo, disattivo la registrazione macro.

Ottengo: "ActiveSheet.ListObjects("Tabella1").Range.AutoFilter Field:=1, Operator:=  xlFilterValues, Criteria2:=Array(1, "1/31/2020", 1, "4/30/2020")".

Provo a rilanciare la macro ed ottengo errore ("Errore nel metodo Autofilter per la classe Range"): le istruzioni sono quelle registrate da Excel stesso!

Inoltre, se io volessi (passo successivo) ricavare il filtro impostato (magari per poterlo reimpostare successivamente), quali istruzioni VBA sono necessarie? Ho cercato in giro (ListObjects...), ma non sono riuscito a levare un ragno dal buco.

Grazie per la solita vostra disponibilità

Ivo

Problema Filtro VBA

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

5 risposte

Ordina per: Più utili
  1. Anonimo
    2020-11-07T17:08:09+00:00

    Ciao,

    sì è vero.

    Penso che quel tipo di criterio non sia "intercettabile".

    Non so se perché sia una matrice e la proprietà non riesce a restituirla.

    La cosa è strana perché la proprietà Criteria1 (o 2) viene dichiarata variant e quindi dovrebbe restituire una matrice.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2020-11-07T14:55:03+00:00

    Grazie,

    funziona ... quasi! Nel senso che se indiche nel filtro un "Filtro per date" (>, >, >=, ecc.) va bene; ma selezionando, ad esempio, un mese nella checkbox (es.: "gennaio"), poi ottengo valori vuoti

    Buona giornata

    Ivo

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2020-11-07T13:25:17+00:00

    Questa funzione, creata a suo tempo per altra discussione con Norman, memorizza tutti i paramentri presenti nei filtri di una tabella.

    Function Parametri_Filtri_Tabella(sNomeFoglio, sNomeTabellaPrincipale As String) As Variant

       Dim Ws As Worksheet

       Dim arrFilters As Variant

       Dim i As Long, iFilters As Long

       Dim bAutoFilterMode As Boolean

       Set Ws = ThisWorkbook.Worksheets(sNomeFoglio)

       With Ws

          With .ListObjects(sNomeTabellaPrincipale)

             If .ShowAutoFilter Then

                iFilters = .AutoFilter.Filters.Count

                ReDim arrFilters(1 To iFilters, 1 To 3)

                On Error Resume Next

                For i = 1 To iFilters

                   With .AutoFilter.Filters(i)

                      If .On Then

                         arrFilters(i, 1) = .Criteria1

                         arrFilters(i, 2) = .Operator

                         arrFilters(i, 3) = .Criteria2

                      End If

                   End With

                Next i

             End If

          End With

          On Error GoTo 0

       End With

       Memorizza_Filtri_Tabella_Principale = arrFilters

    End Function

    In pratica viene creata una matrice con i parametri dei filtri di ogni colonna di una tabella.

    Ad es. se la colonna della Data nella tabella è la prima avrai che la funzione

    Parametri_Filtri_Tabella(NomeFoglio,NomeTabella)(1,1) restituisce il paramentro Criteria1

    Parametri_Filtri_Tabella(NomeFoglio,NomeTabella)(1,2) restituisce il paramentro Operator

    Parametri_Filtri_Tabella(NomeFoglio,NomeTabella)(1,3) restituisce il paramentro Criteria2

    In una tabella il filtro puoi facilmente indiduarlo in base all'indice del nome della colonna della tabella.

    Ad es. se l'intestazione fosse Data potresti passare alla prima dimensione della matrice restituita dalla funzione

    Foglio.ListObjects(NomeTabella).ListColumns("Data").Index

    Spero che la spiegazione non sia troppo poco comprensibile :)

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2020-11-07T07:46:21+00:00

    Grazie, casanmanner.

    Per quanto riguarda la macro iniziale, l’ho modificata in

      “ActiveSheet.ListObjects("Tabella1").Range.AutoFilter Field:=1, Operator:= _

    xlFilterValues, Criteria1:=Array("01/04/2020", "30/04/2020")”

    e così funziona (però quella originale, con il registratore di macro, mi dava errore).

    Il codice VBA che mi hai proposto per settare il filtro automatico, funziona (grazie).

    Ma la mia domanda è: ok, ho settato un filtro (a mano o con VBA) ed ora vorrei, con VBA, ricavare quali sono i parametri con cui l’ho settato (come avevi correttamente intuito). Si riesce in qualche modo a fare una cosa del genere? Credo di sì, ma non ci sono riuscito.

    Grazie per la disponibilità e buona giornata

    Ivo

    La risposta è stata utile?

    0 commenti Nessun commento
  5. Anonimo
    2020-11-05T06:25:50+00:00

    Ciao Ivo,

    se provo a lanciare la macro che hai registrato nel tuo foglio non mi vengono segnalati errori di VBA e ottengo questi dati filtrati:

    Per la seconda domanda non ho ben capito.

    Tu vorresti da una tabella già filtrata (e di cui non sono noti i parametri del filtro) intercettare quali sono i parametri del filtro, memorizzarli da qualche parte, per poi utilizzare gli stessi?

    Comunque prova questa macro che imposta un filtro automatico tra due date e vedi se funziona da te o ti dà errori:

    Sub FiltraDate()

       Dim DataIniziale As Date

       Dim DataFinale As Date

       DataIniziale = CDate("02/01/2020")

       DataFinale = CDate("15/01/2020")

       With ActiveSheet

          With .ListObjects("Tabella1")

             .Range.AutoFilter Field:=.ListColumns("Data").Index

             .Range.AutoFilter Field:=.ListColumns("Data").Index, _

                               Criteria1:=">=" & Format(DataIniziale, "mm/dd/yyyy"), _

                               Operator:=xlAnd, _

                               Criteria2:="<=" & Format(DataFinale, "mm/dd/yyyy")

          End With

       End With

    End Sub

    La risposta è stata utile?

    0 commenti Nessun commento