Letzte nicht leere Zelle in einer Spalte

112

Kennt jemand die Formel, um den Wert der letzten nicht leeren Zelle in einer Spalte in Microsoft Excel zu finden?

MichaelS
quelle
Ich würde VBA dafür suchen.
David Heffernan

Antworten:

76

Dies funktioniert sowohl mit Text als auch mit Zahlen und es ist egal, ob leere Zellen vorhanden sind, dh es wird die letzte nicht leere Zelle zurückgegeben.

Es muss ein Array eingegeben werden , dh Sie drücken Strg-Umschalt-Eingabetaste, nachdem Sie es eingegeben oder eingefügt haben. Das Folgende gilt für Spalte A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))
Doug Glancy
quelle
@ Jean-François, Entschuldigung, ich habe das gestern Abend in einem Kommentar bestätigt, aber versehentlich in den ursprünglichen Beitrag eingefügt. Es funktioniert in XL 2007 und 2010. Danke.
Doug Glancy
Funktioniert in Excel 2007 nicht für mich. Ich habe die genaue Formel eingefügt. Ich habe eine Spalte (A), in der die Werte = ROW () bis 127ish sind, und die Formel gibt "1"
DontFretBrett
2
@DontFretBrett, Geben Sie es unbedingt als Array-Formel mit Strg-Umschalt-Eingabetaste ein, wie in der Antwort angegeben.
Doug Glancy
@ DougGlancy scheitern meinerseits. Danke dir!
DontFretBrett
1
Der wichtige Unterschied besteht darin, dass dieser eine Zellreferenz zurückgibt (so dass er an zB CELL()oder übergeben werden kann OFFSET()), während der höher bewertete einen Wert zurückgibt, ohne Ihnen zu sagen, wo er sich befindet.
GSerg
127

Die folgende einfache Formel zu verwenden ist viel schneller

=LOOKUP(2,1/(A:A<>""),A:A)

Für Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

Es bietet Ihnen folgende Vorteile:

  • Es ist keine Array- Formel
  • Es ist keine flüchtige Formel

Erläuterung:

  • (A:A<>"") Gibt das Array zurück {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")ändert dieses Array in {1,1,..,#DIV/0!,..}.
  • Da LOOKUPerwartet wird, dass das sortierte Array in aufsteigender Reihenfolge sortiert ist und berücksichtigt wird, dass die LOOKUPFunktion , wenn sie keine exakte Übereinstimmung finden kann, den größten Wert in lookup_range(in unserem Fall {1,1,..,#DIV/0!,..}) auswählt, der kleiner oder gleich dem Wert (in unserem Fall 2) ist. Die Formel findet den letzten 1im Array und gibt den entsprechenden Wert von result_range(dritter Parameter - A:A) zurück.

Auch kleine Anmerkung - obige Formel berücksichtigt keine fehlerhaften Zellen (Sie können sie nur sehen, wenn die letzte nicht leere Zelle einen Fehler aufweist). Wenn Sie sie berücksichtigen möchten, verwenden Sie:

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)

Bild unten zeigt den Unterschied:

Geben Sie hier die Bildbeschreibung ein

Dmitry Pavliv
quelle
Danke für die Erklärung und das schöne Bild. Es bleiben noch einige Fragen offen: 1. Die Dokumentation LOOKUPbesagt, dass das letzte Argument result_vectoroptional ist. Wenn ich es jedoch weglasse, erhalte ich ein sehr seltsames Ergebnis, das ich nicht verstehe.
Honza Zidek
2. In der Dokumentation heißt es: "Wenn die LOOKUPFunktion das nicht finden kann lookup_value, stimmt die Funktion mit dem größten Wert überein, der lookup_vectorkleiner oder gleich ist. lookup_value." Wenn ich =LOOKUP(2,A:A<>"",A:A)den #DIV/0!Fehler ohne Generierung von verwende 1/..., scheint es, dass sie einen Wert in der Mitte von zurückgibt der Vektor. Ich habe nicht gefunden, was die genaue Funktionalität in diesem Fall ist.
Honza Zidek
1
Sehr schöne Erklärung. Nachdem ich kürzlich die Berechnung um Minuten verkürzt habe, indem ich Formeln von Array-Formeln in Nicht-Array-Versionen verschoben habe, bin ich immer auf der Suche nach Logik, die funktioniert, ohne dass Array-Formeln erforderlich sind.
tobriand
1
@Enissay, ja, dieser gibt die Zeilennummer zurück, =LOOKUP(2,1/(A:A<>""),ROW(A:A))aber das Hinzufügen einer ROWFunktion fügt den "Volatilitäts" -Effekt hinzu - die Formel wird jedes Mal neu berechnet, wenn eine Zelle auf dem Arbeitsblatt geändert wird
Dmitry Pavliv
1
Sie da. Vielen Dank für die Veröffentlichung. Nur neugierig, fand ich unter exceljet.net/formula/get-value-of-last-non-empty-cell genau die gleichen Formeln und fast den gleichen Wortlaut . Bist du das auch du oder jemand anderes? Es gibt keine offensichtliche Verbindung.
Solomon Rutzky
24

Hier ist eine weitere Option: =OFFSET($A$1;COUNTA(A:A)-1;0)

Patrick Honorez
quelle
9
Dies funktioniert nicht, wenn Zellen mit nicht numerischen Werten vorhanden sind ( COUNTAanstelle von verwenden COUNT). Ganz zu schweigen von leeren Zellen.
Jean-François Corbett
3
Dies sollte oben sein. Es ist einfach und basiert nicht auf obskuren Details ungewöhnlicher Funktionen.
Tmdean
9
Es sollte nicht oben sein, da es falsch ist, wenn in die Ergebnisse Leerzeichen eingebettet sind.
Myrddin Emrys
17

Inspiriert von der großartigen Führung durch Doug Glancys Antwort, fand ich einen Weg, dasselbe zu tun, ohne eine Array-Formel zu benötigen. Fragen Sie mich nicht warum, aber ich möchte die Verwendung von Array-Formeln möglichst vermeiden (nicht aus irgendeinem Grund, es ist nur mein Stil).

Hier ist es:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

Zum Suchen der letzten nicht leeren Zeile mit Spalte A als Referenzspalte

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

Zum Suchen der letzten nicht leeren Spalte mit Zeile 1 als Referenzzeile

Dies kann in Verbindung mit der Indexfunktion weiter verwendet werden, um dynamische benannte Bereiche effizient zu definieren. Dies ist jedoch etwas für einen anderen Beitrag, da dies nicht mit der hier angesprochenen unmittelbaren Frage zusammenhängt.

Ich habe die oben genannten Methoden mit Excel 2010 sowohl "nativ" als auch im "Kompatibilitätsmodus" (für ältere Versionen von Excel) getestet und sie funktionieren. Auch hier müssen Sie Strg + Umschalt + Eingabetaste nicht ausführen. Indem wir die Funktionsweise von Sumproduct in Excel nutzen, können wir uns auf die Notwendigkeit konzentrieren, Array-Operationen durchzuführen, aber wir tun dies ohne eine Array-Formel. Ich hoffe, jemand da draußen wird die Schönheit, Einfachheit und Eleganz dieser vorgeschlagenen Summenproduktlösungen genauso schätzen wie ich. Ich bestätige jedoch nicht die Speichereffizienz der oben genannten Lösungen. Nur dass sie einfach sind, schön aussehen, dem beabsichtigten Zweck helfen und flexibel genug sind, um ihre Verwendung auf andere Zwecke auszudehnen :)

Hoffe das hilft!

Alles Gute!

Santiago
quelle
1
Informationen zur Verwendung von Nicht-Array-Formeln finden Sie in der folgenden Antwort .
sancho.s ReinstateMonicaCellio
16

Ich weiß, dass diese Frage alt ist, aber ich bin mit den Antworten nicht zufrieden.

  • LOOKUP, VLOOKUP und HLOOKUP haben Leistungsprobleme und sollten wirklich niemals verwendet werden.

  • Array-Funktionen haben viel Overhead und können auch Leistungsprobleme verursachen. Daher sollten sie nur als letztes Mittel verwendet werden.

  • COUNT und COUNTA stoßen auf Probleme, wenn die Daten nicht zusammenhängend nicht leer sind, dh Sie haben Leerzeichen und dann wieder Daten in dem fraglichen Bereich

  • INDIRECT ist volatil und sollte daher nur als letztes Mittel eingesetzt werden

  • OFFSET ist volatil und sollte daher nur als letztes Mittel eingesetzt werden

  • Verweise auf die letzte mögliche Zeile oder Spalte (z. B. die 65536. Zeile in Excel 2003) sind nicht robust und führen zu zusätzlichem Overhead

Das benutze ich

  • wenn der Datentyp gemischt ist: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • wenn bekannt ist, dass die Daten nur Zahlen enthalten: =MATCH(1E+306,[RANGE],1)

  • wenn bekannt ist, dass die Daten nur Text enthalten: =MATCH("*",[RANGE],-1)

MATCH hat den geringsten Overhead und ist nicht flüchtig. Wenn Sie also mit vielen Daten arbeiten, ist dies die beste Verwendung.

W5ALIVE
quelle
Dies ist eine gute Antwort (+1), aber es gibt immer noch einige Lücken, die diese Methode übersehen kann. Wenn beispielsweise Zellen mit logischen Werten ( TRUE/ FALSE) vorhanden sind, werden diese nicht erkannt. Trotz der Tatsache, dass diese Antwort nicht kugelsicher ist, denke ich immer noch, dass diese Antwort den geringsten Einfluss auf die Leistung hat.
ImaginaryHuman072889
2
Match gibt einen Index zurück, nicht den Wert der Zelle. Sie können die Indexfunktion verwenden, um den Wert abzurufen. Außerdem sollten Sie wahrscheinlich etwas darüber hinzufügen, was [RANGE] sein soll. Ich habe die gesamte Spalte mit "N: N" ausgewählt. Hier ist ein Beispiel, das für mich funktioniert hat: =INDEX(N:N,MATCH(1E+306,N:N,1))
Swimfar
10

Dies funktioniert in Excel 2003 (und später mit geringfügigen Änderungen, siehe unten). Drücken Sie Strg + Umschalt + Eingabetaste (nicht nur die Eingabetaste), um dies als Array-Formel einzugeben.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

Beachten Sie, dass Excel 2003 keine Array-Formel auf eine gesamte Spalte anwenden kann. Dies ergibt #NUM!; Es können unvorhersehbare Ergebnisse auftreten! (EDIT : Widersprüchliche Informationen von Microsoft: Der gleichen Mai oder möglicherweise nicht über Excel 2007 wahr sein; Problem kann im Jahr 2010 festgelegt wurde )

Aus diesem Grund wende ich die Array-Formel auf den Bereich an A1:A65535und behandle die letzte Zelle, die sich A65536in Excel 2003 befindet, speziell . Kann nicht einfach sagen A:Aoder sogar, A1:A65536wenn letztere automatisch zurückkehrt A:A.

Wenn Sie absolut sicher A65536sind, dass es leer ist, können Sie den IFTeil überspringen :

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))

Beachten Sie, dass bei Verwendung von Excel 2007 oder 2010 die letzte Zeilennummer 1048576 und nicht 65536 lautet. Passen Sie daher die obigen Angaben entsprechend an.

Wenn sich in der Mitte Ihrer Daten keine leeren Zellen befinden, würde ich einfach die einfachere Formel verwenden =INDEX(A:A,COUNTA(A:A)).

Jean-François Corbett
quelle
Für ROW anstelle von Spalte funktionierte dies für mich=INDEX(19:19,COUNTA(19:19))
Serj Sagan
8

Eine alternative Lösung ohne Array-Formeln, die möglicherweise robuster ist als die einer vorherigen Antwort mit einer (Hinweis auf eine) Lösung ohne Array-Formeln , ist

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

Sehen Sie diese Antwort als Beispiel. Ein großes Lob an Brad und Barry Houdini , die bei der Lösung dieser Frage geholfen haben .

Mögliche Gründe für die Bevorzugung einer Nicht-Array-Formel sind angegeben in:

  1. Eine offizielle Microsoft-Seite (suchen Sie nach "Nachteile der Verwendung von Array-Formeln").
    Array-Formeln können magisch erscheinen, haben aber auch einige Nachteile:

    • Sie können gelegentlich vergessen, STRG + UMSCHALT + EINGABETASTE zu drücken. Denken Sie daran, diese Tastenkombination zu drücken, wenn Sie eine Array-Formel eingeben oder bearbeiten.
    • Andere Benutzer verstehen Ihre Formeln möglicherweise nicht. Array-Formeln sind relativ undokumentiert. Wenn also andere Personen Ihre Arbeitsmappen ändern müssen, sollten Sie entweder Array-Formeln vermeiden oder sicherstellen, dass diese Benutzer verstehen, wie sie geändert werden.
    • Abhängig von der Verarbeitungsgeschwindigkeit und dem Arbeitsspeicher Ihres Computers können große Array-Formeln die Berechnungen verlangsamen.
  2. Array-Formel-Häresie .

sancho.s ReinstateMonicaCellio
quelle
Ich kann das nicht mit der D-Spalte zum Laufen bringen. Ich habe alle AVorkommen durch a ersetzt D. Was mache ich falsch?
März 2377
5

Wenn Sie in Spalte (A) suchen, verwenden Sie:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))

Wenn Ihr Bereich A1: A10 ist, können Sie Folgendes verwenden:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))

in dieser Formel:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))

Gibt die letzte nicht leere Zeilennummer zurück und indirekt () gibt den Zellenwert zurück.

Sharif Lotfi
quelle
2

=MATCH("*";A1:A10;-1) für Textdaten

=MATCH(0;A1:A10;-1) für numerische Daten

Liharvi
quelle
Bitte verwenden Sie Codeblöcke, wenn Sie in Ihren Antworten einen Code-Ausschnitt angeben.
β.εηοιτ.βε
Ich denke, diese Formeln geben uns die erste nicht leere Zelle, nicht die letzte nicht leere Zelle.
Baodad
2

Ich habe alle nichtflüchtigen Versionen ausprobiert, aber nicht eine der oben angegebenen Versionen hat funktioniert. Excel 2003 / 2007update. Dies kann sicherlich in Excel 2003 erfolgen. Weder als Array noch als Standardformel. Ich erhalte entweder nur einen leeren 0- oder # Wertfehler. Also greife ich auf die flüchtigen Methoden zurück. Das hat funktioniert.

= LOOKUP (2,1 / (T4: T369), T4: T369)

@ Julian Kroné .. Mit ";" statt "," funktioniert NICHT! Ich denke, Sie verwenden Libre Office nicht MS Excel? LOOKUP ist so ärgerlich flüchtig, dass ich es nur als letzten Ausweg benutze

entfernte
quelle
0

Platzieren Sie diesen Code in einem VBA-Modul. Sparen. Suchen Sie unter Funktionen nach Benutzerdefiniert nach Diese Funktion.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function
Mac vd Wsthuizen
quelle
2
Dies ist nicht unbedingt die letzte leere Zelle, sondern nur die nächste leere Zelle, die oben beginnt.
Portland Runner
Die Frage ist über eine Formel, nicht VBA
Patrick Honorez
0

für Textdaten:

EQUIV("";A1:A10;-1)

für numerische Daten:

EQUIV(0;A1:A10;-1)

Dies gibt Ihnen den relativen Index der letzten nicht leeren Zelle im ausgewählten Bereich (hier A1: A10).

Wenn Sie den Wert erhalten möchten, greifen Sie über INDIRECT darauf zu, nachdem Sie die absolute Zellreferenz textuell erstellt haben, z.

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))
Adel
quelle
0

Ich hatte auch das gleiche Problem. Diese Formel funktioniert auch gleich gut: -

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14 ist die Zeilennummer der ersten Zeile in den Zeilen, die Sie zählen möchten.

Chronischer Klauenzahn

Chronischer Klauenzahn
quelle
0

Ich habe HLOOKUP benutzt

A1hat ein Datum; A2:A8hat Prognosen zu unterschiedlichen Zeiten erfasst, ich möchte die neuesten

=Hlookup(a1,a1:a8,count(a2:a8)+1)

Dies verwendet eine Standard-Hlookup-Formel, wobei das Lookup-Array durch die Anzahl der Einträge definiert wird.

Chris
quelle
0

Wenn Sie wissen, dass es dazwischen keine leeren Zellen geben wird, ist dies der schnellste Weg.

=INDIRECT("O"&(COUNT(O:O,"<>""")))

Es zählt nur die nicht leeren Zellen und verweist auf die entsprechende Zelle.

Es kann auch für einen bestimmten Bereich verwendet werden.

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

Dies gibt die letzte nicht leere Zelle im Bereich O4: O34 zurück.

Tassos Mallis
quelle
0

Für Microsoft Office 2013

"Vorletzter" einer nicht leeren Zeile:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

"Letzte" nicht leere Zeile:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)
Aprodan
quelle
0

Diese Formel hat bei mir für Office 2010 funktioniert:

= LOOKUP (2; 1 / (A1: A100 ""); A1: A100)

A1: die erste Zelle A100: Beziehen Sie sich beim Vergleich auf die letzte Zelle

Wahed
quelle
0

Ich denke, die Antwort von W5ALIVE kommt der am nächsten, mit der ich die letzte Datenzeile in einer Spalte finde. Angenommen, ich suche nach der letzten Zeile mit Daten in Spalte A, würde ich für die allgemeinere Suche Folgendes verwenden:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

Das erste MATCH findet die letzte Textzelle und das zweite MATCH findet die letzte numerische Zelle. Die IFERROR-Funktion gibt Null zurück, wenn der erste MATCH alle numerischen Zellen findet oder wenn die zweite Übereinstimmung alle Textzellen findet.

Grundsätzlich ist dies eine geringfügige Variation der gemischten Text- und Zahlenlösung von W5ALIVE.

Beim Testen des Timings war dies signifikant schneller als die entsprechenden LOOKUP-Variationen.

Um den tatsächlichen Wert dieser letzten Zelle zurückzugeben, bevorzuge ich die indirekte Zellreferenzierung wie folgt:

=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))

Die von sancho.s angebotene Methode ist vielleicht eine sauberere Option, aber ich würde den Teil, der die Zeilennummer findet, dahingehend ändern:

=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)

Der einzige Unterschied besteht darin, dass ", 1" den ersten Wert zurückgibt, während ", 0" das gesamte Wertearray zurückgibt (alle bis auf einen werden nicht benötigt). Ich tendiere immer noch dazu, die Zelle dort an die Indexfunktion zu adressieren, mit anderen Worten, den Zellenwert zurückzugeben mit:

=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))

Toller Thread!

FocusWiz
quelle
0

Wenn Sie keine Angst haben, Arrays zu verwenden, ist das Folgende eine sehr einfache Formel, um das Problem zu lösen:

= SUMME (IF (A: A <> "", 1,0))

Sie müssen STRG + UMSCHALT + EINGABETASTE drücken, da dies eine Arrayformel ist.

Bits_of_guy
quelle
-1

Eine einfache, die für mich funktioniert:

=F7-INDEX(A:A,COUNT(A:A))
nemo
quelle
-1

Okay, ich hatte das gleiche Problem wie der Fragesteller und versuchte beide Top-Antworten. Aber nur Formelfehler bekommen. Es stellte sich heraus, dass ich das "," gegen ";" damit die Formeln funktionieren. Ich benutze XL 2007.

Beispiel:

=LOOKUP(2;1/(A:A<>"");A:A)

oder

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))
Julian Kroné
quelle
-3

Für die Versionsverfolgung (Hinzufügen des Buchstabens v am Anfang der Nummer) fand ich, dass dieser in Xcelsius (SAP Dashboards) gut funktioniert.

="v"&MAX(A2:A500)
Herr B.
quelle
1
Scheint nicht allgemein genug zu sein, da es sich um eine streng aufsteigende Reihenfolge handelt.
Nathan Tuggy