web-dev-qa-db-fra.com

Somme Cumulative Sans Script

Pour this question, j'ai créé une fonction de script Google Apps, qui calcule la somme cumulée d'une plage. Martin Hawksey sur Google+ a commenté un moyen plus efficace de calculer la somme cumulée:

function cumulativeSum(array){
  var output = [];
  for (i in array){
    if(i==0) {
      if (array[i].length > 1) throw ("Only single column of data");
      output.Push([array[i][0]]);
    } else {
      output.Push([output[i-1][0] + array[i][0]]);
    }
  }
  return output;
}

Ma question est: cela peut-il être réalisé avec l'utilisation de la formule?

34
Jacob Jan Tuinstra

Oui:

=ArrayFormula(SUMIF(ROW(A1:A10);"<="&ROW(A1:A10);A1:A10))

Example of Cumulative Sum

Les nombres dans le cercle vert sont ceux qui sont résumés, la formule ArrayFormula remplit toutes les autres en fonction de la cellule dans laquelle elle a été collée. Dans cet exemple, j'ai collé dans A11, B1 et C1 pour montrer son effet.

Ce tableur que j’ai fait il ya quelque temps tente d’expliquer comment MMULT peut être utilisé pour résoudre ce type de problèmes, et illustre également la solution SUMIF sur l’une des feuilles, qui peut (et devrait probablement) être utilisé pour des cas spéciaux comme celui de cette question.

28
AdamL

En supposant que vous voulez:

  Row | A | B | B's formula
  --------------------------------
   1  | 1 | 1 | =1     (or =A1)
   2  | 2 | 3 | =1+2   (or =A2+B1)
   3  | 3 | 6 | =1+2+3 (or =A3+B2)

etc...

Vous pouvez ensuite utiliser: =sum($A$1:A1)A1 est le début des nombres à additionner. Mettez cette formule dans B1 (ou où vous le souhaitez) et remplissez-la, et elle additionnera toutes les cellules jusqu'à la suivante la ligne sur laquelle vous vous trouvez. Vous pouvez également utiliser le format =Ax+Bx-1 (x = ligne actuelle, données en A, somme cumulée en B) de la section "Formule de B" ci-dessus.

28
Farfromunique

Bien que la réponse acceptée soit sur place, elle présente un inconvénient majeur en raison du fait que le dernier paramètre de SUMIF doit toujours être une "plage valide". calcul du total courant avancé MMULT est la meilleure option:

=ARRAYFORMULA(IF(LEN(A1:A), 
 MMULT(TRANSPOSE((ROW(A1:A)<=TRANSPOSE(ROW(A1:A)))*A1:A), SIGN(A1:A)^2), ))

0

0
user0