Skumulowana suma bez skryptu

35

Na to pytanie utworzyłem funkcję Google Apps Script, która oblicza skumulowaną sumę zakresu. Martin Hawksey w Google+ skomentował bardziej wydajny sposób obliczania skumulowanej sumy:

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;
}

Moje pytanie brzmi: czy można to osiągnąć za pomocą formuł?

Jacob Jan Tuinstra
źródło
Przepraszam za bardzo późną odpowiedź, właśnie zobaczyłem, że wątek w „Podobne” po prawej stronie.
AdamL

Odpowiedzi:

30

Tak:

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

Przykład skumulowanej sumy

Liczby w zielonym kółku to te, które są sumowane, ArrayFormula zapełnia wszystkie pozostałe na podstawie komórki, do której została wklejona, w tym przykładzie wkleiłem w A11, B1 i C1, aby pokazać jej efekt.

Ten arkusz kalkulacyjny, który zrobiłem jakiś czas temu, próbuje wyjaśnić, w jaki sposób MMULT może być użyty do tego rodzaju problemów, a także pokazuje rozwiązanie SUMIF na jednym z arkuszy, który może (i prawdopodobnie powinien) być używany w szczególnych przypadkach, takich jak ten w tym pytaniu.

AdamL
źródło
Wziąłem tę formułę raz (myślę, że to była Twoja) na forum Google: SUMIF (ROW (A: A); „<” i ROW (A: A)), które nie działały. Ten robi.
Jacob Jan Tuinstra
Obraz w odpowiedzi został edytowany przez innego członka: + Xavier Casto
AdamL
1
@Fogest, skorzystałem z produktu o nazwie „Snagit”, dowiedz się więcej na stronie techsmith.com/download/snagit
Xavier Casto,
@XavierCasto Och, używałem tego już dawno temu, nie pamiętałem, żeby to miało, chociaż dawno temu. Dziękuję za odpowiedź, ale lubię produkty techsmith.
ComputerLocus
31

Zakładając, że chcesz:

  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)

itp...

Następnie możesz użyć: =sum($A$1:A1)gdzie A1jest początek liczb do zsumowania. Umieść tę formułę B1(lub gdziekolwiek chcesz) i wypełnij ją, a zsumuje wszystkie komórki aż do wiersza, w którym jesteś. Alternatywnie możesz użyć =Ax+Bx-1formatu (x = bieżący wiersz, dane w A, suma skumulowana w B) z sekcji „formuła B” powyżej.

Farfromunique
źródło
7
To wydaje się działać i jest znacznie prostsze niż zaakceptowana odpowiedź
K Raphael
1
uzgodniono, że jest to prostsze i działa bezproblemowo!
loretoparisi
1

Chociaż przyjęta odpowiedź jest na miejscu, ma ona poważną wadę, ponieważ ostatni parametr SUMIFmusi zawsze być „prawidłowym zakresem”, więc jeśli chodzi o bardziej zaawansowane obliczanie sumy bieżącej, MMULTlepszym rozwiązaniem jest:

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

0

użytkownik0
źródło