In Excel summieren Sie hierarchische Daten basierend auf dem Vorhandensein von Unterdaten

554
Sir Robert

Ich habe eine Reihe von Zeilen wie diese, die einige hierarchische Daten anzeigen.

 A | B | C | D | E | F   1 Task | | 1 | | 2 |  2 Task | | 1 | | 2 |  3 Task | | | | 8 |  4 | Subtask | | 2 | | 4  5 | Subtask | | 2 | | 4  6 Task | | 1 | | 2 |  7 Task | | 1 | | 2 |  

Die Spalten A und B sind Aufgaben und Unteraufgaben, die Spalten C und D sind Eingaben, die jeder Aufgabe / Unteraufgabe entsprechen. Die Spalten E und F sind die Transformationsspalten C und D (hier werden sie einfach verdoppelt).

Beachten Sie, dass C3 leer ist, da der Task keinen Wert direkt gegeben wird. es ist eher die Summe der Teilaufgaben. Dementsprechend ist E3 = SUM (F4: F5).

Derzeit mache ich das manuell. Ich hätte gerne eine Funktion, die etwa den folgenden Pseudocode ausführen würde:

IF( NOT(C3=""), C3, SUM_UNTIL(E:E,NOT(""),F:F) ) 

Die Zelle E3 würde also:

  • Verwenden Sie den Wert in C3, wenn C3 nicht leer ist.
  • Wenn C3 leer ist, SUMME () die Zellen in F4: F für eine beliebige Anzahl aufeinanderfolgender leerer Zellen in C.

Ich bin ziemlich gut bis sehr gut in Excel. Ich bin auch ein Programmierer, aber ich kenne VB überhaupt nicht (Linux-Typ), also bin ich mit einer VB-Lösung zufrieden. Ich spreche fließend in JavaScript, damit es auch funktioniert, wenn es eine Art Javascript-Plugin für Excel gibt.

Ich verwende die neueste Version von Excel (vielleicht 2016? Die neueste Business Edition von Office).

0

1 Antwort auf die Frage

1
Vylix

Dies ist möglicherweise nicht die effizienteste Formel, aber das funktioniert

=IF(AND(ISBLANK(B3); ISBLANK(C3)); SUM(INDIRECT("F"&ROW()+1&": F"&MATCH(TRUE; INDEX($B4:$B$16=""; 0); 0)+ROW()-1)); C3*2) 

Erläuterung

AND(ISBLANK(B3); ISBLANK(C3));erkennt, wann die Summenformel beginnen soll. Es erfordert sowohl Zelle B3und C3leer zu sein (wenn Sie nur verwenden C3, dann C4und C5werden auch die Summenformel auslösen, statt ihren Wert zu verdoppeln)

INDIRECT( ... ) bildet den Bereich, in dem verwendet werden soll SUM

"F"&ROW()+1&":der Bereich beginnt an Fund unter der aktuellen Zeile (in diesem Beispiel F4)

F"&MATCH(TRUE; INDEX($B4:$B$16=""; 0); 0)+ROW())und endet an der FZeile in der nächsten leeren Zelle in SpalteB

Hinweis: Bitte beachten Sie, dass der Bereich eine Zeile unterhalb der aktuellen Zeile beginnt und endet. Beachten Sie auch die Position der absoluten Vorzeichen ( $ ).


Weitere Erläuterungen dazu habeMATCH(TRUE; INDEX($B4:$B$16=""; 0); 0)+ROW()-1 ich hier gefunden

Zuerst INDEX($B4:$B$16=""; 0)erstellt ein Array, ob B4 = ""und B5 = ""und so weiter. Dieses Array kann sehen, indem Sie die Formel in Zeile 1 auf einem beliebigen Spalte setzen und verändern 0zu ROW()-1und die Formel nach unten ziehen.

FALSE FALSE FALSE TRUE and so on... 

Dann MATCH(TRUE; ... ; 0)wird die erste gefunden TRUE, dh die erste nächste leere Zeile nach dieser Zeile (Rückgabe des Index 3 ).

Das Ergebnis ist jedoch der Index des Arrays 3 anstelle der Zeilennummer . Also fügen wir den Index mit der aktuellen Zeile, 3 + 3 und voila! Wir haben die Zeilennummer der nächsten leeren Zeile. Fügen Sie einfach hinzu -1, um sicherzustellen, dass der korrekte Bereich von F4:F5nicht summiert wird F4:F6.

Vielen Dank! Das hat sehr gut funktioniert. Für alle anderen, die es nützlich finden: Der große Trick, den Sie sich merken sollten, ist, dass der INDIRECT-Anteil ("F" & ROW () + 1 ": F" ...) nicht horizontal gezogen wird (das "F" muss jedes Mal manuell geändert werden) Zeilen ändern). Sir Robert vor 7 Jahren 0