![Suchen Sie die vorherige Zeile mit einem bestimmten Wert in Spalte A](https://rvso.com/image/1452870/Suchen%20Sie%20die%20vorherige%20Zeile%20mit%20einem%20bestimmten%20Wert%20in%20Spalte%20A.png)
Anhand des obigen Beispielblatts, das die semantischen Zeilen „Kopfzeile“, „Unterüberschrift“ und „Zwischensumme“ enthält, versuche ich, eine Formel zu ermitteln, um die vorherige Unterüberschriftszeile relativ zur aktuellen Zelle zu lokalisieren. Wenn die Formel beispielsweise in eingegeben würde F5
, würde sie die Zeile lokalisieren 2
, und wenn sie in eingegeben würde F17
, würde sie die Zeile lokalisieren 13
.
Die Zeilen werden bedingt als Überschrift, Unterüberschrift oder Zwischensumme formatiert, je nach Vorhandensein von Werten H
oder S
in T
der Spalte $A:$A
, d. h. die Unterüberschriftszeile n
ist eine Zeile, in der $An = "S"
. Nun möchte ich dieses Konzept auf meine Formeln ausweiten.
Auf eine Kopfzeile folgt immer eine Unterüberschrift (ich muss mir also keine Gedanken über Kopf- und Unterüberschriften machen, die in der falschen Reihenfolge stehen).
Ich habe Folgendes versucht:
=MATCH("S", OFFSET($A5, 0, 0, -ROW($A5), 1), 0)
Dies gibt immer Zeile zurück
2
, weilMATCH
gibt dieErsteÜbereinstimmung im Satz, und ich kann dieOFFSET
Höhe nicht begrenzen (d. h. rekursiv, da die vorherige Unterüberschriftsposition unbekannt ist);{=LARGE(MATCH("S", OFFSET($A5, 0, 0, -ROW($A5), 1), 0), 1)}
Dies gibt auch zurück
2
, weil selbst im Array-Kontext (d. h. mit Ctrl+ Alt+ Enter)MATCH
immer noch nur das erste Ergebnis zurückgegeben wird.=LARGE(IF(OFFSET($A5, 0, 0, -ROW($A5), 1)="S", ROW(OFFSET($A5, 0, 0, -ROW($A5), 1))), 1)
Dies gibt zurück
0
, daIF
hier kein Array erwartet wird, und erweitert es daherOFFSET($A5, 0, 0, -ROW($A5), 1)
zu einem einzelnen Wert0
, der nicht übereinstimmt"S"
und als ZahlLARGE
behandelt wird .FALSE
{=LARGE(IF(OFFSET($A5, 0, 0, -ROW($A5), 1)="S", ROW(OFFSET($A5, 0, 0, -ROW($A5), 1))), 1)}
Dies gibt zurück
#VALUE
, weil die Array-Erweiterung zu früh erfolgt, was-ROW($A5)
als Array übrig bleibt-{5}
, was auch kein gültiger numerischerheight
Parameter istOFFSET
(ich wollte,IF(OFFSET(...)="S",...)
dass das Bit ein Array ist, nicht das-ROW($A5)
Bit, aber Excel kann nicht unterscheiden).
Ich konzentriere mich derzeit auf Excel 2010. Frühere Versionen sind nicht anwendbar (obwohl die Vorwärtskompatibilität ein Bonus ist). Ich versuche, VBA zu vermeiden, da es für mich schwieriger ist, *.xlsm-Dateien zu verteilen als *.xlsx-Dateien (außerdem weiß ich bereits, wie das mit VBA geht).
Gibt es noch andere Dinge, die ich versuchen kann?
Antwort1
Der einfache Weg, dies zu tun, besteht darin, zu schummeln und eine gemischte absolute/relative Formel zu verwenden. Dies ist eine Array-Formel (Eingabe mit STRG+UMSCHALT+EINGABE), die in die Zelle eingegeben wird, B4
aber an beliebiger Stelle in Zeile 4 stehen könnte. Sie gibt die Zeilennummer der markierten Formel zurück S
.
=MAX(IF($A$1:A4="S",ROW($A$1:A4)))
Beim Kopieren nach unten wird der zweite Teil der Referenz B4 and A4
erhöht. Dadurch wird sichergestellt, dass Sie die Zeile mit der größten Übereinstimmung erhalten, dieüberdie aktuelle Zeile. Sie können diese Formeln schneller eingeben, indem Sie F4nach dem Eingeben/Auswählen des entsprechenden Bereichs verwenden. Dadurch werden die Dollarzeichen durch alle Auswahlmöglichkeiten durchlaufen.
Bild der Bereiche
Wird verwendet, um Ihre Formeln zu ersetzen
Nachdem ich die Frage ein wenig gelesen habe (und basierend auf der Bearbeitung von @SteveTaylor), scheint es, dass Sie dies dazu verwenden, Ihre Formeln zu aktualisieren. Sie können die von oben zurückgegebene Zeile verwenden, um INDEX
Datenbereiche zum Summieren zu erhalten. Ich sehe 2 Formeln, die ersetzt werden können:
- Berechnung der Gesamtsumme für jede beschriftete Datenzeile. In diesem Fall kann dynamisch auf die darüber liegende Zwischensummenzeile verwiesen werden.
- Gesamtberechnung für die Zwischensummenzeile. In diesem Fall können die oben zu summierenden Werte dynamisch referenziert werden.
Für die einzeiligen Daten können Sie die Formel verwenden, beginnend F3
mit einer Array-Formel. Beachten Sie, dass ich auf die Verwendung umgestiegen bin, SUMPRODUCT
wodurch es viel einfacher ist, zu mehr als 2 Spalten zu gelangen.
=C3*SUMPRODUCT(INDEX(D:E,MAX(IF($A$1:A3="S",ROW($A$1:A3))),),D3:E3)
Für die Formel zur Gesamtzeile können Sie, beginnend in F11
, wieder die Array-Formel verwenden:
=SUM(F10:INDEX($F$1:F10, 1+MAX(IF($A$1:A11="S",ROW($A$1:A11)))))
Wenn Sie eine Formel für alle anderen wollen, können Sie diese zu einer verschachtelten Formel IF
basierend auf dem Wert in der Spalte kombinieren A
. Hier ist die Array-Formel, deren Anfangszeile F2
nach unten kopiert werden kann.
=IF(
A2="S",
SUM(D2:E2),
IF(A2="T",
SUM(F1:INDEX($F$1:F1, 1+MAX(IF($A$1:A2="S",ROW($A$1:A2))))),
C2*SUMPRODUCT(INDEX(D:E,MAX(IF($A$1:A2="S",ROW($A$1:A2))),),D2:E2)))
Diese Formel unterscheidet nicht zwischen einer leeren Zeile und einer „Daten“-Zeile. Derzeit gibt sie 0 für die Abstandszeile zurück, was in Ordnung ist.
Bild der Ergebnisse und Formelnfür zwei Blöcke Ihrer Daten.