martedì 15 febbraio 2022

Google Sheets - Somma multiriga o multicolonna con ARRAYFORMULA()

Non l'ho capita ma me la annoto nel blog perché funziona.

Ho una tabella della quale voglio sommare per ogni riga, i valori delle colonne da B a - poniamo - H.
Inoltre li voglio sommare solo se la colonna A non è vuota.
E se aggiungo o rimuovo colonne tra B e H, la formula dovrebbe tenerne conto.

In riga 2 i titoli:

NOME | ORE1 | ORE2 | ORE3 | ... | OREn | TOT-ORE

Mettendo =SOMMA(B3:H3) in riga 3 e trascinandola su ogni riga sottostante è facile. Ma se volessi mettere la formula solo "nel titolo" e non pensarci più? Ci vorrebbe ARRAYFORMULA(), ma non funziona con SOMMA().

Con Google Sheets, la funzione SOMMA() richiede un intervallo o un elenco di celle o intervalli da sommare, ma poi riporta sempre un unico risultato.
Se si usa un intervallo (es. A2:E7), qualora nel foglio vengano aggiunte righe o colonne all'interno dell'intervallo, questo viene esteso automaticamente per comprendere anche quelle (e diventa per esempio A2:E7 o A2:D8),
Se nella formula si elencano solamente le celle o intervalli, Google non può sapere se quando aggiungiamo una colonna o riga nel foglio la vogliamo aggiungerne anche nella formula e non la aggiunge.

SOMMA() non funziona con ARRAYFORMULA() in quanto se scrivo SOMMA(A1:D7) questa espressione ha il significato di sommare tutte le celle dell'intervallo e dar un unico risultato mentre il mio intento era quello di avere un risultato per ogni riga. E se scrivo ARRAYFORMULA(SOMMA(A1:D7)) Google non può capire il mio intento e giustamente continua a darmi un unico risultato.

Cercando, ho trovato su stackoverflow (https://stackoverflow.com/questions/21797621/arrayformula-sum-in-google-spreadsheet) una formula che pare fare al caso mio.
Ho lievemente adattato la formula per verificare che in colonna A ci siano celle con contenuto e quindi mettere un risultato solo su righe valide e non in quelle vuote.
La formula, messa nella riga del titolo (riga 2),  mostrerà "Totale Ore" in riga 2 e sotto elenca le somme delle varie colonne a fianco.
Se aggiungo o tolgo colonne la formula si allarga o restringe da sé.

La formula ARRAYFORMULA() con SOMMA.SE()

={"Totale ore"; ARRAYFORMULA(SE(A3:A <> ""; (SOMMA.SE(SE(RIF.COLONNA(B:H); RIF.RIGA(A3:A)); RIF.RIGA(A3:A); B3:H));))}

In RIF.COLONNA() va indicato l'intervallo orizzontale ("B.H" in questo caso).
In RIF.RIGA() va indicato l'intervallo verticale. Indicando A3:A si va dalla riga 3 fino al fondo. La "A" non ha importanza, sarebbe lo stesso con B3:B o A3:Z perché RIF.RIGA() riporta solo il numero di riga.
Se si volesse limitare l'intervallo occorrerebbe indicare per esempio A3:A10.

Funziona anche se si vuole disporre in orizzontale una serie di somme dei valori presenti in colonne diverse, per esempio questa formula, messa in C9 somma i dati delle righe da 3 a 8 delle colonne da D in poi, se in riga 1 la cella non è vuota.
Notare il "\" che posto invece di ";" a separare il titolo da ARRAYFORMULA(), dispone le cose in orizzontale. 

={"Totale ore"\ ARRAYFORMULA(SE(D1:1 <> ""; (SOMMA.SE(SE(RIF.RIGA(3:8); RIF.COLONNA(D1:1)); RIF.COLONNA(D1:1); D3:8));))}

Credo di dover comprendere meglio il SOMMA.SE() per capire bene questa formula.

Nei due precedenti casi gli intervalli sono aperti ma la formula funziona anche se si limitano le colonne o le righe sulle quali operare.

Nessun commento:

Posta un commento

NOTA: Attualmente i commenti sono moderati, vale a dire che non compariranno immediatamente. Questo mi consente sia eliminare eventuale spam sia di leggere i messaggi e eventualmente rispondere.