Eine Arrayformel, um die vorherige nicht leere Zelle in einer anderen Spalte zu finden


7

Ist es in Google Spreadsheets ohne Verwendung von Apps Script usw. möglich, Folgendes mit einer einzigen Formel zu erreichen, z. B. arrayformula(oder vielleicht mmultoder etwas Seltsames, aber ohne Auffüllen) oben in Spalte B?:

Szenario:

Spalte A: Zellen sind leer oder nicht leer

Tor:

Spalte B: enthält die letzte nicht leere Zelle von Spalte A.

Beispiel:

input | output
===============
    a | a
------+--------
      | a
------+--------
      | a
------+--------
    5 | 5
------+--------
      | 5
------+--------
    c | c
------+--------
    c | c
------+--------
      | c
------+--------
    a | a
------+--------

Antworten:


9

Kurze Antwort

=ArrayFormula(vlookup(ROW(1:10),{IF(LEN(A1:A10)>0,ROW(1:10),""),A1:A10},2))

Erläuterung

Angenommen, die Eingabedaten in der Column Afolgenden Tabelle befinden sich in der Zelle B1.

Hinweis: Um die Auswertung der Formel zu vereinfachen, Column Awiederholt die (Eingabe) keine Werte, funktioniert jedoch mit allen Arten von Werten (Buchstaben, Zahlen, Symbole, wiederholt, unsortiert usw.).

      |    A       B   
  === + ======= =======
   1  |    a       a   
   2  |            a   
   3  |    b       b   
   4  |            b   
   5  |            b   
   6  |    c       c   
   7  |    d       d   
   8  |    e       e   
   9  |            e   
  10  |    f       f   

VLOOKUP wurde ausgewählt, da es verwendet werden kann, um ungefähre Werte zu finden, und mehrere Werte (Array) zurückgeben kann.

Da die Eingabewerte in beliebiger Reihenfolge angezeigt werden können, wurde anstelle der tatsächlichen Werte die Zeilennummer für nicht leere Zellen verwendet, und leere Zellen haben eine leere Zeichenfolge zugewiesen "".

Es wurde LENanstelle von ISBLANKZellen mit Formeln verwendet, die eine leere Zeichenfolge zurückgeben. FALSEDies kann in einigen gängigen Szenarien zu Problemen führen.

IF(LEN(A1:A10)>0,ROW(1:10),"")

HINWEIS: Wenn Sie drei Zeichen speichern möchten, kann der zweite Parameter ( ""das Zeichen ist das Parametertrennzeichen ,) entfernt werden. Bei der Analyse dieses Teils der Formel werden leere Zellen zurückgegeben FALSE.

Da VLOOKUPdie Nachschlagespalte die erste Spalte anstelle eines Bereichs sein muss, wurde ein "halb manuell" erstelltes Array verwendet.

{IF(LEN(A1:A10)>0,ROW(1:10),""),A1:A10}

Der obige Ansatz spart uns Zellen und Verarbeitungszeit.


1
Kann durch Weglassen ""des if-Befehls etwas kürzer gemacht werden (weggelassenes Argument ist standardmäßig leer).

Ah, das ist klug. Ich sehe, Sie erstellen eine temporäre Nachschlagetabelle, in der Zeilen Werten zugeordnet werden ({IF (...), ...} besteht aus den Zeilen 1-> a, 3-> b, 6-> c, ... mit einigen leeren Zeilen), dann führen Sie eine Suche durch. Danke auch für die Erklärung! Was meinen Sie jedoch mit "Um die Auswertung zu vereinfachen, wiederholt die Spalte A (Eingabe) keine Werte"? Dies scheint mit doppelten Werten umzugehen (abcae ...), nicht wahr?
Ninjagecko

@ninjagecko: Ich habe über die Beispiel-Eingabedaten gesprochen. Ich erwähnte dies, weil das OP wiederholte Daten enthielt. Ich werde diesen Teil umformulieren, um das klarer zu machen.
Rubén

@Normal: Ich habe nicht auslassen , ""aber eine Notiz , dass und ersetzt hinzugefügt ROW(A1:A10)durch ROW(1:10). :)
Rubén

1
@ninjagecko: Vielleicht führt die Verwendung des Begriffs "bewerten" in meiner Antwort aufgrund Ihres Hintergrunds zu Verwirrung. In Ihrem Web-Apps-Profil teilen Sie nicht viel darüber, aber ich kann sehen, dass Sie in SO einen Ruf von 35.000 haben. Daher denke ich, dass Sie "auswerten" häufig als etwas verwenden, das von einem Computer ausgeführt wird. In meinem Fall habe ich zum ersten Mal darüber nachgedacht, was Menschen getan haben. In diesem Fall ist "who" der Formelersteller / -adopter, insbesondere diejenigen, die zuvor in Google Sheets nicht zusammen vlookup und Arrays verwendet haben.
Rubén

2

Zusätzlich zum vorherigen Beitrag ermöglicht die folgende Formel die Verwendung offener Bereiche, sodass die Ausgabe automatisch erweitert wird, wenn der angegebenen Spalte neue Werte hinzugefügt werden (A im folgenden Beispiel).

=ArrayFormula(
   if(row(A2:A) <= max(if(not(isblank(A2:A)),row(A2:A))),
      vlookup(row(A2:A),filter({row(A2:A),A2:A},len(A2:A)),2),
   )
 )

BEARBEITEN: Wenn Sie nicht möchten, dass die Ausgabe auf die letzte Zeile der Quelldaten beschränkt wird, können Sie die Endzeile wie folgt fest codieren:

=ArrayFormula( if(row(A:A) <= 20, vlookup(row(A:A),filter({row(A:A),A:A},len(A:A)),2), ) )

Eine Einschränkung dieser Formel ist, dass sie in der letzten Zeile der Datenquelle "stoppt". Ich denke, dass dies in der Antwort erwähnt werden sollte.
Rubén

@ Rubén: Ich denke, das kann leicht geändert werden. Angenommen, Sie möchten, dass die Ausgabe nach der letzten Zeile der Quelldaten fortgesetzt wird (z. B. Zeile 20). Sie können die Formel in = ArrayFormula ändern (if (Zeile (A: A) <= 20, vlookup (Zeile (A: A) ), Filter ({Zeile (A: A), A: A}, Länge (A: A)), 2),))
JPV

Das sollte auch in der Antwort erwähnt werden, denke ich.
Rubén

1
@ Rubén: Ich habe es gerade getan. ;-)
JPV

-1

Sie können diese Formel ausprobieren:

=ArrayFormula(if(ISBLANK(A1:A10);INDEX(A1:A10;ROW()-1;COLUMN());A1:A10))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.