Antworten:
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))))
CELL()
oder übergeben werden kann OFFSET()
), während der höher bewertete einen Wert zurückgibt, ohne Ihnen zu sagen, wo er sich befindet.
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:
Erläuterung:
(A:A<>"")
Gibt das Array zurück {TRUE,TRUE,..,FALSE,..}
1/(A:A<>"")
ändert dieses Array in {1,1,..,#DIV/0!,..}
.LOOKUP
erwartet wird, dass das sortierte Array in aufsteigender Reihenfolge sortiert ist und berücksichtigt wird, dass die LOOKUP
Funktion , 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 1
im 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:
LOOKUP
besagt, dass das letzte Argument result_vector
optional ist. Wenn ich es jedoch weglasse, erhalte ich ein sehr seltsames Ergebnis, das ich nicht verstehe.
LOOKUP
Funktion das nicht finden kann lookup_value
, stimmt die Funktion mit dem größten Wert überein, der lookup_vector
kleiner 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.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
aber das Hinzufügen einer ROW
Funktion fügt den "Volatilitäts" -Effekt hinzu - die Formel wird jedes Mal neu berechnet, wenn eine Zelle auf dem Arbeitsblatt geändert wird
Hier ist eine weitere Option: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
anstelle von verwenden COUNT
). Ganz zu schweigen von leeren Zellen.
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!
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.
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.
=INDEX(N:N,MATCH(1E+306,N:N,1))
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:A65535
und behandle die letzte Zelle, die sich A65536
in Excel 2003 befindet, speziell . Kann nicht einfach sagen A:A
oder sogar, A1:A65536
wenn letztere automatisch zurückkehrt A:A
.
Wenn Sie absolut sicher A65536
sind, dass es leer ist, können Sie den IF
Teil ü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))
.
=INDEX(19:19,COUNTA(19:19))
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:
Eine offizielle Microsoft-Seite (suchen Sie nach "Nachteile der Verwendung von Array-Formeln").
Array-Formeln können magisch erscheinen, haben aber auch einige Nachteile:
A
Vorkommen durch a ersetzt D
. Was mache ich falsch?
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.
=INDEX(A:A, COUNTA(A:A), 1)
von hier genommen
=MATCH("*";A1:A10;-1)
für Textdaten
=MATCH(0;A1:A10;-1)
für numerische Daten
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
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
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))
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
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.
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!
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.
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))))
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)