Usare il Filtro Avanzato. - dal 04/09/04 pagina vista: volte

Sui due siti esistono molti esempi sull'uso del Filtro per ottenere restituzioni di interrogazioni su dati presenti in database (o tabelle che dir si voglia) poste sui fogli di lavoro di una cartella Excel.

Questa volta ci occupiamo dell'uso del Filtro Avanzato, sfruttando una possibilità fra quelle che questo tipo di Filtro permette:  l'esigenza di ottenere (estrarre, filtrare) da una colonna di dati, tutti i dati non doppioni.

Una pratica a volte necessaria specie quando in elenchi lunghi, compaiono più volte gli stessi dati, e vogliamo ottenere una copia di tutti i dati, ma riportati una sola volta.

Possiamo eseguire la filtrazione in due modi:

  • Filtrare i dati sul posto (verranno nascoste tutte le righe dei dati riportati più di una volta (dati doppi, tripli, ecc.).

  • Copiare i dati in un'altra colonna (verranno copiati tutti i dati ma non verranno copiati i doppioni).

Le istruzioni, molto semplici da capire, si basano sul metodo AdvancedFilter, che richiede la seguente sintassi:

  • espressione.AdvancedFilter - dove con espressione indicheremo l'intervallo dei dati (nella colonna) a cui intendiamo applicare il filtro.

  • Action - è l'argomento che definisce il tipo di azione da intraprendere, e potrà essere una sola di queste due costanti: xlFilterCopy (se vogliamo che i dati vengano copiati in una altra posizione) e  xlFilterInPlace (se vogliamo eseguire la filtrazione sul posto).

  • CopyToRange - se con Action avremo scelto xlFilterCopy, avremo bisogno di definire anche l'argomento CopyToRange indicando la sola cella iniziale della colonna dove vorremo che i dati univoci vengano copiati. Se invece avremo optato per la filtrazione sul posto (xlFilterInPlace) questo argomento dovremo ometterlo.

  • Unique - è l'argomento responsabile della copia univoca di dati multipli, e per questo va  impostato a True.

Vediamo subito due semplici esempi: supponiamo che i dati da filtrare si trovino nella colonna A, da A1:A1000, e che vorremo estrarre, copiando i dati una sola volta, nella colonna F, partendo dalla cella F1:

  • Sub FiltraECopia()
    Range("A1:A1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range("F1"), Unique:=True
    End Sub

nell'altro esempio invece filtreremo i dati sul posto; questo tipo di azione, a differenza del precedente, provoca la contrazione delle righe (vengono nascoste) i cui dati sono doppioni, avremo bisogno quindi di una successiva istruzione per ripristinare l'elenco originale, scoprendo le righe. Vediamo l'applicazione del filtro:

  • Sub SulPosto()
    Range("A1:A1000").AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    End Sub

come si nota, è stato omesso l'argomento CopyToRange. Questa sotto è l'istruzione per togliere il filtro e ritornare all'elenco originale:

  • Sub Ripristina()
    ActiveSheet.ShowAllData
    End Sub

Accorgimenti: per evitare che se ad inizio elenco troviamo due valori uguali, questi due vengano comunque copiati ripetuti, sarà necessario impostare una "etichetta di colonna" (anche dal menù Inserisci/Nome/Etichetta/Etichetta di colonna) ed usare poi la prima cella come "intestazione di campo", quindi ad esempio scrivere "Nominativi" (o la descrizione del contenuto dell'elenco). Questo accorgimento ci consente, oltre alla possibilità di avere, nel caso di copia, un solo valore ripetuto se i primi due sono uguali (i primi due sotto l'etichetta di colonna), di inizializzare il nuovo elenco (quello copiato), con quella che Excel saprà essere una "etichetta di colonna"; questa operazione, unita all'opzione Header:=xlYes (anzichè Header:=xlGuess) del metodo Sort per l'ordinamento dei valori, consentirà di ordinare il nuovo elenco lasciando ad inizio elenco l'intestazione di colonna prevista, mentre l'ordinamento avverrà su tutti i valori sottostanti.

Comunque, una eventuale istruzione vba per creare una "etichetta di colonna" è la seguente: (la cella A1 è l'ipotetica cella iniziale dell'elenco, dove avremo scritto l'intestazione di campo, e potremo scriverla ad inizio della routine più sotto):

  • Range("A1").FormulaLabel = xlColumnLabels

Ognuno potrà decidere l'azione da definire, ma sicuramente la possibilità di ricreare un nuovo elenco con dati univoci, si presta a moltissime implicazioni, come ad esempio ottenere un elenco di voci univoche da usare come elenco per caricare ListBox oComboBox, assegnando il nuovo elenco al RowSource (o ListFillRange) di una eventuale ListBox. Sarà possibile inoltre creare un'ordinamento alfabetico del nuovo elenco, senza sconvolgere la tabella di origine, in modo da ottenere nella ListBox la giusta sequenza di dati.

Riporto, come esercizio, la routine completa di creazione nuovo elenco con i dati univoci, il loro ordinamento, e l'assegnazione dell'intervallo ad una ListBox posta sul foglio di lavoro. Userò gli stessi intervalli già visti sopra, anche se sarà possibile come destinazione dell'elenco filtrato, usare una colonna fuori vista, come l'ultima (la IV):

  • Sub FiltraOrdinaCarica()

  • Range("A1").FormulaLabel = xlColumnLabels  'impostiamo la cella A1 come etichetta di colonna
    'sotto: applichiamo il filtro copiando i dati nella colonna F, a partire da F1
    Range("A1:A1000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Range( "F1"), Unique:=True
    'sotto: con "x" prendiamo il numero di riga estremo dell'elenco appena formato
    x = Sheets(1).[F1].End(xlDown).Row
    'sotto: ora concateniamo la "x" per definire l'ultima riga di F nell'assegnazione dell'intervallo a cui applicare l'ordinamento, e ordiniamo da A a Z il nuovo elenco:
    Range("F1:F" & x & "").Sort Key1:=Range("F1"), Order1:=xlAscending, Header:=xlYes, _
    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
    'sotto: ora assegniamo l'intervallo del nuovo elenco come ListFillRange della ListBox1 posta sul Foglio1
    Sheets(1).ListBox1.ListFillRange = "F1:F" & x & ""
    End Sub

Molti sono gli utilizzi di un elenco univoco, ognuno potrà adattarlo alle proprie necessità; a volte è un suggerimento che conta, e spero di averne suggerito uno.

Buon lavoro.

prelevato sul sito www.ennius.altervista.org