Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Impara Ordinamento e Filtro dei Dati | Automazione di Tabelle e Report
Excel VBA per l'Automazione Aziendale

Ordinamento e Filtro dei Dati

Scorri per mostrare il menu

Il filtraggio restringe ciò che è visibile senza modificare i dati sottostanti — fondamentale per creare un report che mostri solo un mese o una regione alla volta.

Figura 4.2

Filtro automatico di base

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter non elimina né sposta alcun dato — nasconde le righe che non corrispondono, esattamente come se si facesse clic sulla freccia a discesa e si deselezionasse tutto tranne January manualmente. Field:=1 conta le colonne a partire da 1 all'interno della Tabella stessa (Month, Region, Sales, Expenses, Profit, Target — quindi Region sarebbe Field:=2, Profit Field:=5), motivo per cui questa riga deve essere mantenuta sincronizzata se le colonne vengono mai riordinate.

Filtri con più condizioni

Filtrare per più di un valore nella stessa colonna richiede xlFilterValues e un array di criteri:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Confronta questo con il filtro a valore singolo sopra: Criteria1 ora contiene un Array(...) di valori accettabili invece di una semplice stringa, e Operator:=xlFilterValues indica ad AutoFilter di trattare quell'array come un elenco di corrispondenze invece di interpretarlo come una singola espressione di criterio. Se si omette Operator:=xlFilterValues, questa riga genera un errore o si comporta in modo imprevisto — è facile dimenticarsene ed è importante ricontrollare ogni volta che Criteria1 è un elenco.

Filtrare su una condizione numerica — ad esempio, solo le righe in cui Profit supera Target di un margine significativo — utilizza invece operatori di confronto:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Nota che ">15000" è scritto come testo tra virgolette anche se si tratta di un confronto numerico — AutoFilter si aspetta sempre Criteria1 come stringa e interpreta il simbolo > all'inizio. Scrivere Criteria1:=15000 senza il > filtrerebbe solo le righe esattamente uguali a 15000 invece che quelle maggiori, un errore comune e facile da commettere.

Ordinamento

L'oggetto Sort supporta più chiavi, proprio come la finestra di dialogo Dati → Ordina:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear viene eseguito per primo così che eventuali chiavi di ordinamento residue da una precedente esecuzione della macro (o da un ordinamento manuale della Tabella) non si combinino silenziosamente con le nuove — è sempre meglio cancellare prima di aggiungere. L'ordine in cui appaiono le due chiamate .Add2 è importante tanto quanto le impostazioni Order:=xlAscending/xlDescending: la prima aggiunta diventa la chiave di ordinamento primaria (Month), la seconda diventa il criterio di risoluzione dei pari all'interno di ciascun gruppo (Profit, il più alto per primo all'interno di ogni mese). .Header = xlYes indica a Excel che la riga 1 è un'intestazione e non deve mai essere spostata dall'ordinamento; .Apply è ciò che effettivamente avvia l'ordinamento — tutto ciò che lo precede serve solo a costruire le istruzioni.

Rimozione dei filtri

È sempre consigliabile rimuovere i filtri all'inizio di una macro di report, così ogni esecuzione parte da uno stato noto e non filtrato:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode è un valore Boolean che è True ogni volta che un filtro sta restringendo le righe visibili della Tabella — controllarlo prima evita un errore di runtime, poiché chiamare ShowAllData quando nulla è effettivamente filtrato genera un errore invece di non fare nulla silenziosamente.

Attività

  1. Scrivere una macro che filtri tblReports solo per febbraio, utilizzando AutoFilter Field:=1.
  2. Estenderla per filtrare la Regione (Field:=2) solo su "East" e "West" contemporaneamente, utilizzando xlFilterValues.
  3. Cancellare entrambi i filtri, quindi ordinare la tabella prima per Regione in ordine crescente, poi per Profitto in ordine decrescente, utilizzando l'oggetto Sort mostrato sopra.
Suggerimento
expand arrow

1. Filtrare per febbraio

  • Field:=1 si riferisce alla prima colonna della Tabella, non del foglio di lavoro — Mese è la colonna 1 all'interno di tblReports, indipendentemente dalla colonna fisica sul foglio.
  • Criteria1 accetta il testo esatto su cui filtrare, tra virgolette.
  • Si richiama AutoFilter su tbl.Range, non direttamente sul foglio di lavoro.

2. Aggiunta del filtro Regione

  • Regione è la seconda colonna della tabella, quindi è un numero Field:= diverso rispetto al filtro Mese.
  • Per filtrare su due valori nella stessa colonna serve Criteria1:=Array(...) con entrambi i valori all'interno, più Operator:=xlFilterValues — dimenticare questo operatore è l'errore più comune.
  • Entrambi i filtri (Mese e Regione) possono essere attivi contemporaneamente — basta chiamare AutoFilter due volte, una per colonna.

3. Cancellare i filtri e ordinare

  • Controllare tbl.AutoFilter.FilterMode prima di chiamare ShowAllData — chiamarlo quando nulla è filtrato genera un errore.
  • L'oggetto Sort richiede prima .SortFields.Clear, poi un .SortFields.Add2 per ogni livello di ordinamento — l'ordine in cui li aggiungi decide quale sia la chiave primaria e quale il criterio di spareggio, non l'ordine in cui appaiono nella tabella.
  • Regione crescente deve essere aggiunto prima di Profitto decrescente, poiché Regione deve essere il criterio di ordinamento principale.
Soluzione
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Eseguire FilterFebruaryEastWest e dovresti vedere solo le righe di febbraio per le regioni East e West visibili. Poi eseguire ClearFiltersAndSort — tutte le righe riappariranno, ordinate prima per Regione (in ordine alfabetico) e, all'interno di ogni Regione, il Profitto più alto apparirà per primo.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 2

Chieda ad AI

expand

Chieda ad AI

ChatGPT

Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione

Ordinamento e Filtro dei Dati

Il filtraggio restringe ciò che è visibile senza modificare i dati sottostanti — fondamentale per creare un report che mostri solo un mese o una regione alla volta.

Figura 4.2

Filtro automatico di base

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter non elimina né sposta alcun dato — nasconde le righe che non corrispondono, esattamente come se si facesse clic sulla freccia a discesa e si deselezionasse tutto tranne January manualmente. Field:=1 conta le colonne a partire da 1 all'interno della Tabella stessa (Month, Region, Sales, Expenses, Profit, Target — quindi Region sarebbe Field:=2, Profit Field:=5), motivo per cui questa riga deve essere mantenuta sincronizzata se le colonne vengono mai riordinate.

Filtri con più condizioni

Filtrare per più di un valore nella stessa colonna richiede xlFilterValues e un array di criteri:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Confronta questo con il filtro a valore singolo sopra: Criteria1 ora contiene un Array(...) di valori accettabili invece di una semplice stringa, e Operator:=xlFilterValues indica ad AutoFilter di trattare quell'array come un elenco di corrispondenze invece di interpretarlo come una singola espressione di criterio. Se si omette Operator:=xlFilterValues, questa riga genera un errore o si comporta in modo imprevisto — è facile dimenticarsene ed è importante ricontrollare ogni volta che Criteria1 è un elenco.

Filtrare su una condizione numerica — ad esempio, solo le righe in cui Profit supera Target di un margine significativo — utilizza invece operatori di confronto:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Nota che ">15000" è scritto come testo tra virgolette anche se si tratta di un confronto numerico — AutoFilter si aspetta sempre Criteria1 come stringa e interpreta il simbolo > all'inizio. Scrivere Criteria1:=15000 senza il > filtrerebbe solo le righe esattamente uguali a 15000 invece che quelle maggiori, un errore comune e facile da commettere.

Ordinamento

L'oggetto Sort supporta più chiavi, proprio come la finestra di dialogo Dati → Ordina:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear viene eseguito per primo così che eventuali chiavi di ordinamento residue da una precedente esecuzione della macro (o da un ordinamento manuale della Tabella) non si combinino silenziosamente con le nuove — è sempre meglio cancellare prima di aggiungere. L'ordine in cui appaiono le due chiamate .Add2 è importante tanto quanto le impostazioni Order:=xlAscending/xlDescending: la prima aggiunta diventa la chiave di ordinamento primaria (Month), la seconda diventa il criterio di risoluzione dei pari all'interno di ciascun gruppo (Profit, il più alto per primo all'interno di ogni mese). .Header = xlYes indica a Excel che la riga 1 è un'intestazione e non deve mai essere spostata dall'ordinamento; .Apply è ciò che effettivamente avvia l'ordinamento — tutto ciò che lo precede serve solo a costruire le istruzioni.

Rimozione dei filtri

È sempre consigliabile rimuovere i filtri all'inizio di una macro di report, così ogni esecuzione parte da uno stato noto e non filtrato:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode è un valore Boolean che è True ogni volta che un filtro sta restringendo le righe visibili della Tabella — controllarlo prima evita un errore di runtime, poiché chiamare ShowAllData quando nulla è effettivamente filtrato genera un errore invece di non fare nulla silenziosamente.

Attività

  1. Scrivere una macro che filtri tblReports solo per febbraio, utilizzando AutoFilter Field:=1.
  2. Estenderla per filtrare la Regione (Field:=2) solo su "East" e "West" contemporaneamente, utilizzando xlFilterValues.
  3. Cancellare entrambi i filtri, quindi ordinare la tabella prima per Regione in ordine crescente, poi per Profitto in ordine decrescente, utilizzando l'oggetto Sort mostrato sopra.
Suggerimento
expand arrow

1. Filtrare per febbraio

  • Field:=1 si riferisce alla prima colonna della Tabella, non del foglio di lavoro — Mese è la colonna 1 all'interno di tblReports, indipendentemente dalla colonna fisica sul foglio.
  • Criteria1 accetta il testo esatto su cui filtrare, tra virgolette.
  • Si richiama AutoFilter su tbl.Range, non direttamente sul foglio di lavoro.

2. Aggiunta del filtro Regione

  • Regione è la seconda colonna della tabella, quindi è un numero Field:= diverso rispetto al filtro Mese.
  • Per filtrare su due valori nella stessa colonna serve Criteria1:=Array(...) con entrambi i valori all'interno, più Operator:=xlFilterValues — dimenticare questo operatore è l'errore più comune.
  • Entrambi i filtri (Mese e Regione) possono essere attivi contemporaneamente — basta chiamare AutoFilter due volte, una per colonna.

3. Cancellare i filtri e ordinare

  • Controllare tbl.AutoFilter.FilterMode prima di chiamare ShowAllData — chiamarlo quando nulla è filtrato genera un errore.
  • L'oggetto Sort richiede prima .SortFields.Clear, poi un .SortFields.Add2 per ogni livello di ordinamento — l'ordine in cui li aggiungi decide quale sia la chiave primaria e quale il criterio di spareggio, non l'ordine in cui appaiono nella tabella.
  • Regione crescente deve essere aggiunto prima di Profitto decrescente, poiché Regione deve essere il criterio di ordinamento principale.
Soluzione
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Eseguire FilterFebruaryEastWest e dovresti vedere solo le righe di febbraio per le regioni East e West visibili. Poi eseguire ClearFiltersAndSort — tutte le righe riappariranno, ordinate prima per Regione (in ordine alfabetico) e, all'interno di ogni Regione, il Profitto più alto apparirà per primo.

Tutto è chiaro?

Come possiamo migliorarlo?

Grazie per i tuoi commenti!

Sezione 4. Capitolo 2
some-alt