2013-09-23 16 views
17

Come creare un foglio di calcolo di Google somma() che termina sempre sulla cella sopra, anche quando vengono aggiunte nuove celle? Ho diversi calcoli di questo tipo da effettuare su ogni singola colonna, quindi solutions like this non sarà di aiuto.somma foglio di calcolo Google che termina sempre nella cella sopra

Esempio:

Sulla colonna B, ho diverse gamme dinamiche che deve essere sommati. B1..B9 deve essere sommato su B10 e B11..B19 deve essere sommato su B20. Ho decine di calcoli da fare. Ogni tanto aggiungo le righe sotto l'ultima riga sommata e voglio che vengano aggiunte alla somma. Aggiungo una nuova riga (chiamiamola 9.1) prima della riga 10 e una nuova raw (chiamiamola 19.1) prima della riga 20. Voglio che B10 contenga la somma di B1 a B9.1 e B20 per contenere la somma di B11: B19.1.

Su excel, ho il offset function che fa come il fascino. Ma come farlo con google spreadsheet? Ho cercato di usare formule come questo:

=SUM(B1:INDIRECT(address(row()-1,column(),false))) # Formula on B10 
=SUM(B11:INDIRECT(address(row()-1,column(),false))) # Formula on B20 

Ma su Google Spreadsheet, tutto ciò che dà è un errore di #NOME.

Ho perso ore cercando di trovare una soluzione, forse qualcuno può calmare? Si prega di avvisare

Amnon

+1

Che cosa è l'attuale? Perche'e'cosi difficile!? –

risposta

39

Probabilmente si sta cercando la formula come: torna

=SUM(INDIRECT("B1:"&ADDRESS(ROW()-1,COLUMN(),4)))

Google Spreadsheet INDIRETTO riferimento a una cella o zona, mentre - da quello che mi ricordo - Excel INDIRETTO restituisce sempre riferimento a una cella. Dato che INDIRECT di Google ha effettivamente delle difficoltà quando si tenta di utilizzarlo all'interno di SUM come riferimento di cella, ciò che si vuole è di alimentare SUM con un intero intervallo da sommare in es. notazione a1: "B1: BX".

Si ottiene l'indirizzo che si desidera nello stesso modo come in Excel (nota "4" qui per riga/colonna relativa, per impostazione predefinita Google restituisce INDIRETTA assoluto):

ADDRESS(ROW()-1,COLUMN(),4)

e poi usarlo per preparare la stringa di intervallo per la funzione SUM concatenando con la cella iniziale.

"B1:"&

e avvolgetelo con INDIRETTI, quale area tornerà ad essere riassumere.

rinvio per la soluzione sotto da Druvision (non posso commentare ancora, non volevo moltiplicare risposte)

Invece di che richiede tempo formule correzioni viene inserito ogni riga volta/cancellati per fare tutto simile:

=SUM(INDIRECT(ADDRESS(ROW()-9,COLUMN(),4)&":"&ADDRESS(ROW()-1,COLUMN(),4)))

è possibile risparmiare una colonna nel foglio separato per mantenere le variabili (diciamo il nome "def"), diciamo Z, per definire i punti di partenza ad es in Z1 scrivere "B1" in Z2 scrivere "B11" ecc. e di usarlo come variabile nel somma utilizzando INDEX:

SUM(INDIRECT(INDEX(def!Z:Z,1,1)&":"&ADDRESS(ROW()-1,COLUMN(),4))) - somme da B1 a fila calcolata, dal momento che in Z1 abbiamo "B1" (il 1,1 in INDEX(...,1,1))

SUM(INDIRECT(INDEX(def!Z:Z,2,1)&":"&ADDRESS(ROW()-1,COLUMN(),4))) - somme da B11 a fila calcolata, dal momento che in Z2 abbiamo "B11" (il 2,1 in INDEX(...,2,1))

si prega di notare:

  1. Foglio separato chiamato "def" - non vuoi che l'inserimento/eliminazione di righe influisca sui dati, quindi tienilo sul lato. Utile per aggiungere alcuni elenchi di convalida, altre cose di cui hai bisogno nelle tue formule.

  2. "Z: Z" notazione - intera colonna. Hai detto di avere un sacco di queste formule;)

questo modo si conserva la flessibilità di definire delle cellule di partenza per ciascuna delle vostre formule, che non è influenzato dai cambiamenti del foglio di calcolo.

A proposito, non sarebbe più semplice scrivere funzioni/script personalizzati sommando tutte le righe sopra la cella? Se hai voglia di fare javascript, da quello che ricordo, il foglio di calcolo di google ora ha un bell'editor di script. Puoi creare una funzione chiamata per es. sumRowsAboveMe() e non solo utilizzarlo nel foglio come =sumRowsAboveMe() nella cella di foglio.

+3

Se si sta codificando la colonna per l'inizio dell'intervallo, potrebbe anche indicizzarlo per la fine dell'intervallo. Può quindi essere semplificato a '= SUM (INDIRETTO (" B1: B "& ROW() - 1))' – aross

+0

Oppure potresti usare offset = sum (offset (B1,0,0, row() - 1)) –

+0

Presumibilmente, la funzione di offset è stata aggiunta dopo la comparsa della domanda. Ma la funzione indice sembra funzionare = somma (B1: indice (B: B, riga() - 1)) –

-1

La risposta di @PsychoFish mi ha guidato nel modo corretto. L'unico problema che ho dovuto riscrivere la formula di nuovo da ogni colonna e ogni somma. Così qui è la formula migliorata, che riassume i 9 celle precedenti sulla stessa colonna, senza hardcoding la colonna o riga numeri:

=SUM(INDIRECT(ADDRESS(ROW()-9,COLUMN(),4)&":"&ADDRESS(ROW()-1,COLUMN(),4))) 

L'unico problema è che ho dovuto riscrivere le formule se qualcuno aggiunge o elimina un riga. In questo caso dovrei cambiare da 9 a 10 o 8 in modo correttivo.

0

Sintassi generale:

=SUM(INDIRECT(cell_reference_as_string1 &":"& cell_reference_as_string2) 

con ad esempio:

cell_reference_as_string1 = ADDRESS(ROW(),COLUMN(),4) 
cell_reference_as_string2 = ADDRESS(ROW()-1,COLUMN(),4) 
3

NOTA Dopo aver testato questa risposta, che funziona solo se la somma è in un diverso colonna a causa di un errore di dipendenza circolare. Altrimenti, la soluzione è valida.

È un po 'di algebra, ma possiamo sfruttare la resistenza in basso a destra del foglio di calcolo.

=SUM(X:X) - SUM(X2:X) 

Dove X è la colonna che si sta lavorando e X2 è il vostro fine punto. Trascina la formula verso il basso e Fogli incrementerà l'X2, cambiando così il punto finale.

* Hai detto che avevi decine di calcoli da fare. Quindi, per soddisfare il tuo bisogno esatto, vorremmo sottrarre la tua ultima somma per ottenere quella gamma "media" che volevamo.

ad es.

B1..B9 dovrebbe essere riassunto sulla B10, e B11..B19 dovrebbe essere riassunto sulla B20

a causa dell'errore dipendenza circolare accennato in precedenza, non riesco a risolvere esattamente e mettere la somma sulla stessa riga, ma potrebbe funzionare in altri casi in cui la somma deve essere memorizzata in una colonna diversa.

=SUM(B:B) - SUM(B9:B) //Formula on C10 (Sum of B1..B9) 
=SUM(B:B) - SUM(B19:B) - B10 // Formula on C20 (Sum of B11..B19) 
1

questo si basa su @PsychoFish, ecco la soluzione:

=SUM(INDIRECT(SUBSTITUTE(ADDRESS(1,COLUMN(),4),"1","")&"3:"&ADDRESS(ROW()-1,COLUMN(),4))) 

sufficiente sostituire la "3" per la riga per avviare la somma.

@PsychoFish è corretto ma non può essere trascinato e copiato poiché la colonna è letterale e codificata, e @Druvision era nella giusta direzione ma era sbagliato ... sostanzialmente si è concluso con lo stesso problema di dover rientrare le gamme e quindi scorrere le formule più e più volte.

0

Voi ragazzi state facendo questo più difficile del necessario. Lascio semplicemente un paio di righe vuote sopra per riga "somma" (puoi formattarle per essere riempite di colore o qualcosa per impedire che vengano usate inavvertitamente), quindi aggiungi le nuove righe appena sopra quelle righe speciali.

Problemi correlati