Sommare valori di celle dei fogli della stessa cartella con riepilogo su un foglio. - dal 04/09/04 pagina vista: volte

Un esercizio interessante per ottenere un totale di valori presenti in determinate celle di ogni  foglio di una cartella. Supponiamo di avere una cartella con più fogli, magari un foglio per ogni mese dell'anno, oppure un foglio per ogni persona che compone un team (agenti, dipendenti, militari, ecc. ecc.). Avremo l'accortezza e la necessità di rinominare ogni foglio assegnandoli un nome di pertinenza (gennaio, febbraio, marzo, ecc., oppure Giorgi, Stefani, Ricci ecc., o ancora nomi di oggetti come viti, bulloni, chiavi, ecc.). Supponiamo di lavorare su fogli mensili, e di avere su ogni foglio una determinata cella, la stessa per ogni foglio, dove otterremo il totale del mese, per esempio il totale delle vendite del mese. Altra condizione prevista: la possibilità di aggiungere Fogli, nominandoli opportunamente.

L'esercizio quindi si articola sulla realizzazione di una routine che "spazzoli" tutti i fogli della cartella, sommando i valori che si troveranno in una determinata cella (la stessa per ogni foglio) e ci restituisca il totale in una cella di un Foglio che chiameremo opportunamente "Riepilogo", e dal quale lanceremo la macro associata ad un pulsante ivi residente. Dobbiamo quindi creare un ciclo che controlli il nome dei fogli, e se il nome è diverso da Riepilogo, prenda il valore che sarà in una cella (es.: C46) di ogni foglio e lo sommi ad un totale che va inizializzato a zero. Poi, siccome la macro la lanceremo dal foglio Riepilogo, quindi il foglio attivo in quel momento, rendiamo la cella A1 (o qualunque altra vorrete) del foglio attivo uguale al totale. Questa la routine:

Sub Total()
tot = 0
'inizializiamo il totalizzatore a zero
For Each ws In Worksheets
'per ogni foglio (ws) dell'insieme Fogli
If ws.Name <> "Riepilogo" Then
'se il nome del foglio (ws) è diverso da Riepilogo allora:
tot = tot + ws.[C46].Value
'si aggiunge a tot il valore che sarà il C46 del foglio
End If
Next ws
 'si passa al foglio successivo
ActiveSheet.[A1] = tot    
'e si pone tot (il totale finale) nella cella del foglio attivo '(Riepilogo)
End Sub

Per chi obiettasse che non sempre la cella che porta il totale di un foglio si può trovare alla stessa altezza (stessa riga) e stessa colonna degli altri fogli, suggerisco di considerare che nessuno ci vieta, per ogni foglio, di scegliere una cella col totale non necessariamente incolonnata ai valori, e magari posta in H1, e che sia la stessa per tutti i fogli. Dipenderà solo dai riferimenti alla zona da sommare, e quindi in H1 metteremo la nostra formula =SOMMA(D1:D500) o qualunque altro riferimento, purchè la funzione risieda in H1.

Una variante all'esercizio appena visto, può essere questa: vogliamo sommare solo i valori delle celle di determinati fogli della stessa cartella, e per ogni "gruppo" di fogli vogliamo destinare il totale ottenuto ad una cella diversa del foglio Riepilogo.

In questo caso però dovremo creare una diversificazione che "unisca" i vari fogli. Questo per far sì che si possano identificare in modo univoco tutti i fogli che appartengono al "gruppo" di cui vogliamo sommare le celle. Visto che possiamo usare il nome foglio per identificarlo, potremo aggiungere una stessa lettera o numero prima del nome del foglio, in modo da creare uniformità. Se volessimo quindi sommare le celle di tutti i fogli che corrispondono ai mesi dispari, ed ottenere al tempo stesso la somma di tutti i mesi pari, potremmo rinominare i fogli aggiungendo ad inizio nome una "d" per il gruppo dei mesi dispari, ed una "p" per quelli pari. (es.: dGennaio, dMarzo, dMaggio - pFebbraio, pAprile, pGiugno ecc.). Questa soluzione ci consentirà poi, leggendo la prima lettera del nome di un foglio, di definire la condizione di appartenenza. Dovremo poi inizializzare tanti totalizzatori per quanti "gruppi" abbiamo formato. Vediamo le istruzioni da usare in questo caso:

Sub totalimisti()

'sotto: inizializiamo 2 totalizzatori, uno per ogni gruppo di somme
tot = 0
tot1 = 0
For Each ws In Worksheets 
'per ogni foglio nell'insieme dei fogli
X = "d" 
'usiamo due variabili per identificare le lettere che cercheremo (X e Y)
Y = "p"

'sotto: usiamo la funzione Left, 1 che ci restituisce la prima lettera del nome del foglio, per 'cui se la prima lettera sarè uguale alla variabile X (cioè "d"), allora
If Left(ws.Name, 1) = X Then
tot = tot + ws.[C15].Value 
'incrementiamo il primo totaliz. con il valore della cella scelta.

'con ElseIf impostiamo una seconda condizione che cercherà, all'interno del ciclo For 'Each.. i fogli la cui lettera iniziale comincialo con la variabile Y ( cioè "p")
ElseIf Left(ws.Name, 1) = Y Then
tot1 = tot1 + ws.[C15].Value 
'incrementiamo il secondo totaliz. con il valore della cella 'scelta.
End If 
 'si finisce con le condizioni e si passa a controllare il successivo foglio con Next.
Next ws
ActiveSheet.[A11] = tot 
'e si pone tot (il primo totale) nella cella voluta del foglio attivo '(Riepilogo)
ActiveSheet.[B11] = tot1 
'e si pone tot1 (il secondo totale) in un'altra cella del foglio 'attivo (Riepilogo)
End Sub

Tutte le alternative al tema sono applicabili: potrete assegnare dei valori reperiti tramite InputBox alle due variabili X e Y in modo da creare condizioni diversificate, oppure legare le condizioni alla lettura di valori presenti nei fogli in celle predeterminate, oppure ancora definire celle diverse da cui sommare i totali in funzione di condizioni legate ancora a valori posti in celle predeterminate, con cicli tipo:

  • .....omissis

  • For Each ws In Worksheets

  • If ws.Name <> "Riepilogo" And ws.[B3] = "Luigi" Then

  • tot = tot + ws.[D50].Value

  • Else

  • tot = tot + ws.[H10].Value

  • End If

  • Next

  • ......omissis

Cioè: se il nome del foglio è diverso da Riepilogo (o il nome che vorrete) e la cella B3 (o quella che vorrete) è uguale a Luigi  (o ciò che vorrete), allora incrementiamo il totalizzatore con il valore che sarà in D50 (o quella che vorrete), altrimenti incrementiamo col valore che sarà nella cella H10 (o quella che vorrete).

Insomma, gli smaliziati capiranno che potranno crearsi tutte più condizioni differenziate lavorando sui SE, dipenderà solo dalle necessità che ognuno potrà avere.

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org