Dati Filtrati: ottenere il loro totale e il valore massimo presente - ma anche Somma.se e Conta.se su dati filtrati. Aggiornamento del 26/08/09 - dal 04/09/04 pagina vista: volte Ovvero: sfruttare la proprietà Hidden (nascosto) dell'oggetto Range. Quando usiamo il filtro lo facciamo perchè vogliamo "raggruppare" e vedere solo i dati corrispondenti al criterio di filtrazione. In tutti i casi in cui sia necessario "lavorare" con i dati così filtrati, ci troviamo di fronte ad alcuni problemini: infatti noi vediamo solo i dati relativi al solo criterio scelto, solo perchè l'applicazione di un filtro "nasconde" le righe con i dati che non interessano (che sono diversi) il criterio scelto, ma Excel le righe nascoste le vede e le considera;; se noi volessimo per esempio sommare tutti i valori relativi al dato scelto, dovremmo fornire per forza di cose i riferimenti all'intervallo di celle da sommare, e qui cominciano i problemi: se infatti i dati cercati sono su righe discontinue, indicando il riferimento iniziale e quello finale, comprenderemmo inevitabilmente anche i dati appartenenti alle celle nascoste, falsando quindi il totale da noi richiesto. Vediamo un esempio di una ipotetica tabella in cui a dei nomi sono associati dei valori:
Qui non ci occupiamo dell'applicazione di un filtro (peraltro trovate esempi specifici sui siti), ma solo di come poter ovviare al problema su descritto. Quindi, se noi si volesse cercare il totale dei valori di Bianchi, troveremmo che l'intervallo che contiene il dato Bianchi, inizia con la riga 1 e termina con la 15, dovremmo quindi indicare l'intervallo B1:B15. Ma tra questi due estremi, esistono dati che con Bianchi non hanno niente a che fare, e che verrebbero visti lo stesso e sommati. L'immagine a destra mostra la tabella con il filtro applicato, dove si vedono chiaramente le righe nascoste (sono infatti visibili solo le righe 2-5-7-9-12 e 15). Se poi oltre al totale dei valori legati a Bianchi, volessimo calcolare anche l'importo maggiore tra i valori presenti, dovremmo ricorrere alla funzione MAX, che comunque anche lei, necessita dell'intervallo di cui considerare il valore massimo presente, e anche qui ci troveremmo di fronte al fatto che verrebbero valutati tutti i valori dell'intervallo, compresi quelli che con Bianchi non c'entrano, falsando il risultato. Tra i vari modi di risolvere il problema, presento una soluzione, con due varianti, che si basa sulla lettura dei dati delle SOLE righe visibili. Userò quindi la proprietà Hidden (nascosto) dell'oggetto Range, che a valore True se le righe (Rows) o le colonne sono nascoste, o False se viceversa, creando una condizione If .. Then di controllo. In questo modo, inserendo la condizione in un ciclo For Next oppure For Each Next, facciamo controllare se le righe NON sono nascoste (quindi Hidden = False ), in questo caso prendiamo il valore che ci interessa e lo totalizziamo. Alla fine del ciclo, il totale ottenuto ci fornirà la somma di tutti i soli valori visibili (cioè quelli filtrati). Per quanto riguarda invece il trovare il valore più alto (Max) tra quelli visibili, possiamo operare in due modi:
Negli esempi che propongo, sia il Totale che il valore Max li faccio restituire in una MsgBox, ma è chiaro che le variabili che rappresentano i due valori, saranno usate come ognuno meglio crede, o registrandole in altre celle, oppure usare in altre istruzioni. Vediamo le due alternative: in entrambe faccio svolgere il ciclo cercando il nome anzichè il valore; il perchè è semplice: se il filtro lo abbiamo applicato al campo "nomi", siamo sicuri che le righe visibili sono tutte quelle che corrispondono al criterio scelto., quindi useremo un ciclo sulla colonna A, prendendo poi con Offset, il valore nella cella, stessa riga, una colonna a destra (Offset(0, 1))
e questa un'imagine del risultato, prima della cancellazione dell'area "x"nella colonna D
e questa un immagine del risultato, in cui ho filtrato il nome Rossi, che portando il valore massimo in terza posizione, dimostra la validità della routine sopra:
E' evidente che la possibilità di lavorare quindi sulle righe NON nascoste (Hidden = False) ci consente tutta una serie di operazioni sfruttando cicli (For Next) che verificano condizioni (If Then) ed eseguano istruzioni appropriate; una recente domanda è alla base di questo aggiornamento: "...Ho un elenco di 500 alunni, maschi e femmine, di varie classi. Ebbene, quando metto il filtro per filtrare una classe, in una cella ottengo il subtotale di quanti alunni sono nella classe. A me servirebbe anche sommare, per quella classe filtrata, il numero di m o f che compaiono. Usando la formula conta.se o somma.se, non riesco a inserire l'intervallo, in quanto con il filtro la numerazione delle celle resta sempre quella reale." Mi sembrava che, suggerito come operare in presenza di dati filtrati, fosse relativamente semplice costruirsi nuove istruzioni adattandole ai concetti più sopra esposti, ma evidentemente qualche esempio in più agevola i lettori meno smaliziati. Dunque, sulla base della domanda di quel lettore, possiamo simulare una tabella del genere: ho impostato solo 4 campi: nome alunno, classe di appartenenza, sesso, un generico campo "valori" giusto per consentire somme di valori diversificati per maschi e femmine; la tabella ha già il filtro applicato, quindi cliccando sul pulsante "Lanciami", attiveremo le seguenti istruzioni:
e questo sarà il risultato del messaggio sui dati filtrati:
Credo che le istruzioni non siano difficili da capire, è chiaro che sono solo esempi ma dovrebbero fornire spunto per adattarle alle proprie esigenze. Conclusioni: Io non conosco formule o funzioni del foglio di lavoro che permettano di rilevare se una riga è nascosta o scoperta, e che consentano quindi di ottenere conta.se o somma.se o comunque operazioni sui dati filtrati (a parte i subtotali o i totali). Morale, ulteriore esempio che il vba è veramente malleabile e consente di fare (quasi) tutto con Excel.
Buon lavoro. prelevato sul sito www.ennius.altervista.org |