Filtrare dati in un elenco ed applicare i subtotali ai dati filtrati. - dal 04/09/04 pagina vista: volte

Quando si predispone una filtrazione su dati di un elenco, può necessitare ottenere dei totali relativi ai soli dati filtrati. Ricordo che in un elenco filtrato, le righe dati che non corrispondono al criterio di ricerca, vengono nascoste, NON eliminate, e se usiamo la funzione =SOMMA su una colonna contenente i valori da sommare, otterremo la somma ANCHE delle celle nascoste. Una maniera per sommare solo i valori legati al criterio di ricerca scelto (e quindi un totale indicizzato al criterio scelto), può essere l'esercizio che presento.

Intanto vediamo un esempio di un database classico, dove abbiamo un campo "mese", un campo "nome", un campo "date" e poi altri campi di imputazioni costi, ed un campo "totale" relativo al totale dei costi riportati sulla stessa riga:

L'esercizio: vogliamo il totale delle varie voci più il totale generale filtrato sul mese. Questo ci consentirà di controllare il totale mensile dei movimenti, indipendentemente dal nome.

Applicheremo quindi un filtro sui campi interessati (Range A3 : O3). Mi limiterò alla spiegazione della semplice routine per l'applicazione di un filtro, mentre la selezione della chiave di filtrazione la faremo manualmente, scegliendo di volta in volta, nel campo mese, il mese che ci interessa (chi desidera vedere come richiedere tramite codice vba la chiave di ricerca, può dare un'occhiata agli articoli "Filtrare Date col vba" e "Filtrare Dati col vba", presenti sul sito ennius.interfree.it). Questa routine, associata ad un pulsante, funziona come metti/togli: un click per inserire il filtro, un click per toglierlo:

Sub MettiToglifiltro()
Range("A3:O3").Select
Selection.AutoFilter
Range("A1").Select
End Sub

Proseguendo, dopo aver applicato il filtro e scelto dal campo "mese" la voce "Settembre", ci troveremo con la nostra tabella filtrata, così:

A questo punto applicheremo le istruzioni per ottenere i SubTotali. Io suggerisco di usare due routine, una per ottenere i subtotali, ed una per rimuoverli. Invito i "pellegrini" a scoprire da soli come ottenerli, andando sul menù Dati/SubTotali e provare cambiando le opzioni presenti nella finestra che si apre, in modo da ottenere i subtotali che vorrete; se poi ripeterete tutto attivando il "registratore di macro", scoprirete anche il codice vba che excel genera su ciò che farete. Comunque proseguiamo con l'esercizio, vedendo le due routine e relative spiegazioni, che non sono difficili:

Sub Subtotali()
'va precisato che l'applicazione di SubTotali richiede che venga selezionata tutta l'area 'interessata all'operazione, e quidi con "zonat" identifichiamo l'area dalla cella riga 3, 'colonna 1 (la A) fino alla colonna 15  (la O), che con End(xlDown) ci consente di 'trovare l'ultima cella occupata. Questo End ci consente di variare l'area da selezionare in 'funzione dei risultati della filtrazione.
Set zonat = Range(Cells(3, 1), Cells(3, 15).End(xlDown))
zonat.Select 
'si seleziona l'area zonat

'ora applichiamo il SubTotal i cui argomenti di rilevanza sono

'GroupBy:= si indica il numero della colonna (cioè il campo) in base al quale raggruppare

'Function:= Specifica la funzione del subtotale, in questo caso vogliamo una somma '(xlSum)

'TotalList:=Array(5, 8, 11, 14, 15) con TotalList indichiamo come Array i numeri dei 'campi (colonne) ai quali vengono aggiunti i subtotali
Selection.Subtotal GroupBy:=2, Function:=xlSum, TotalList:=Array(5, 8, 11, 14, 15), _
Replace:=True, PageBreaks:=False, SummaryBelowData:=True
[a1].Select
 'poi si seleziona una cella per deselezionare l'area zonat
End Sub

E questo l'effetto della routine soprastante:

E questa la routine per togliere i subtotali:

Sub toglisubtot()
'si identifica e seleziona l'area per poter rimuovere i subtotali
Set zonat = Range(Cells(3, 1), Cells(3, 15).End(xlDown))
zonat.Select
Selection.RemoveSubtotal
[a1].Select
End Sub

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org