Fehler bei der Suche nach Letzte benutzte Zelle in Excel mit VBA
Als ich auf der Suche nach dem letzten verwendeten Zelle Wert, den ich benutze:
Dim LastRow As Long
LastRow = Range("E4:E48").End(xlDown).Row
Debug.Print LastRow
Ich bin immer die falsche Ausgabe, wenn ich ein einzelnes element in einer Zelle. Aber wenn ich mehr als einen Wert in die Zelle, die Ausgabe ist korrekt.
Was ist der Grund dafür?
InformationsquelleAutor james | 2012-06-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
HINWEIS: ich beabsichtige, machen dies zu einem "one-stop-post", wo Sie verwenden können, die
Correct
Weg zu finden die Letzte Zeile. Dies wird sich auch auf die besten Praktiken zu Folgen, wenn die Suche nach der letzten Zeile. Und daher werde ich aktualisieren, sobald ich über ein neues Szenario/Informationen.Unzuverlässig Möglichkeiten zu finden, die Letzte Zeile
Einige der häufigsten Wege, suchen der letzten Zeile, die sind sehr unzuverlässig und daher nie verwendet werden soll.
UsedRange
sollte NIE werden verwendet, um die Letzte Zelle, die Daten enthält. Es ist höchst unzuverlässig. Versuchen Sie dieses experiment.Typ etwas in Zelle
A5
. Wenn Sie nun die Berechnung der letzten Zeile mit einer der Methoden, die unten gegeben werden, wird es geben Sie 5. Jetzt die Farbe der ZelleA10
rot. Wenn Sie jetzt verwenden Sie eine der folgenden Codes, erhalten Sie noch 5. Wenn SieUsedrange.Rows.Count
was bekommen Sie? Es werden nicht 5.Hier ist ein Szenario um zu zeigen, wie
UsedRange
funktioniert.xlDown
ist ebenso unzuverlässig.Betrachten Sie diesen code
Was passieren würde, wenn es nur eine Zelle (
A1
), die Daten? Werden Sie am Ende das erreichen der letzten Zeile im Arbeitsblatt! Es ist wie die Auswahl ZelleA1
und drücken Sie dann - Taste und dann drücken von Pfeil nach Unten - Taste. Dies wird auch Ihnen unzuverlässige Ergebnisse, wenn es leere Zellen in einem Bereich.CountA
ist auch unzuverlässig, weil es Ihnen wird Falsches Ergebnis, wenn es leere Zellen dazwischen.Und daher sollte man es vermeiden die Verwendung von
UsedRange
,xlDown
undCountA
zu finden, die Letzte Zelle.Finden, die Letzte Zeile in einer Spalte
Finden Sie die Letzte Zeile in Col E verwenden Sie diese
Wenn Sie bemerken, dass wir eine
.
vorRows.Count
. Wir oft wählte zu ignorieren, dass. Sehen DIESE Frage nach der möglichen Fehler, die Sie bekommen kann. Ich rate immer mit.
vorRows.Count
undColumns.Count
. Diese Frage ist ein klassisches Szenario, wo der code fehl, da dieRows.Count
zurück65536
für Excel 2003 und früheren Versionen1048576
für Excel 2007 und höher. ÄhnlichColumns.Count
zurück256
und16384
bzw.Der oben genannten Tatsache, dass Excel 2007+ hat
1048576
Zeilen legt auch Wert auf die Tatsache, dass wir immer deklarieren Sie die variable, die halten Sie die Zeile Wert alsLong
stattInteger
sonst erhalten Sie eineOverflow
Fehler.Finden, die Letzte Zeile in einem Blatt
Finden die
Effective
Letzte Zeile im Blatt, verwenden Sie diese. Beachten Sie die Verwendung vonApplication.WorksheetFunction.CountA(.Cells)
. Dies ist erforderlich, weil, wenn es keine Zellen mit Daten in dem Arbeitsblatt, dann.Find
geben SieRun Time Error 91: Object Variable or With block variable not set
Finden, die Letzte Zeile in einer Tabelle (ListObject)
Gelten die gleichen Prinzipien, zum Beispiel, um die Letzte Zeile in der Dritten Spalte einer Tabelle:
Wahrscheinlich falsche Wortwahl von mir? Ich meine die tatsächliche Letzte Zeile. Die
Actual
Letzte Zeile kann nicht das gleiche wie dieLast Row
, dass wir vielleicht mitUsedRange
Geben Sie etwas in Zelle A5. Wenn Sie nun die Berechnung der letzten Zeile mit einer der Methoden, die oben gegeben, wird es geben Sie 5. Jetzt Farbe die Zelle A10 rot. Wenn Sie jetzt verwenden Sie eine der oben genannten code, erhalten Sie noch 5. Wenn Sie
Usedrange.Rows.Count
was bekommen Sie? Es werden nicht 5. Usedrange ist höchst unzuverlässig zu finden die Letzte Zeile.Bitte beachten Sie, dass .Finde leider vermasselt die Einstellungen des Benutzers im Dialogfeld "Suchen" - also Excel hat nur 1 festlegen von Einstellungen für das Dialogfeld, und Sie mit .Finden Sie ersetzt. Ein weiterer trick ist, um noch UsedRange verwenden, aber verwenden Sie es als eine absolute (aber unzuverlässigen) maximum, von dem Sie bestimmt die richtige maximale.
Ich denke, dass deine Beschreibung von
UsedRange
(es ist sehr unzuverlässig finden Sie die Letzte Zelle, die Daten enthält) ist irreführend.UsedRange
ist einfach nicht vorgesehen für diesen Zweck, obwohl in einigen Fällen kann es ein korrektes Ergebnis. Ich denke, dass das experiment vorgeschlagen, zusätzliche Verwirrung. Das erreichte Ergebnis mitUsedRange
($A$1:$A$8) hängt nicht von der ersten Eingabe der Daten eines löschen. Die Abbildung auf der rechten Seite wird noch der gleiche sein, auch ohne eingegebenen Daten gelöscht. Bitte siehe meine Antwort.InformationsquelleAutor Siddharth Rout
Als auf den richtigen Weg zu finden, den letzten verwendeten Zelle, die man hat, um zu entscheiden, was als verwendet, und wählen Sie dann eine geeignete Methode. Ich begreife, dass mindestens drei Bedeutungen:
Benutzt = nicht-leer, d.h., dass Daten.
Verwendet = "... im Einsatz, dh den Abschnitt, der enthält Daten oder das formatieren."
Gemäß der offiziellen Dokumentation, das ist das Kriterium, das von Excel beim speichern. Siehe auch diese.
Wenn man sich dessen nicht bewusst, das Kriterium kann zu unerwarteten Ergebnissen führen, aber es kann auch absichtlich ausgenutzt (weniger oft, sicherlich), z.B., zu markieren oder drucken bestimmter Regionen, die möglicherweise keine Daten.
Und, natürlich, ist es wünschenswert, als ein Kriterium für die Auswahl verwenden, wenn Sie eine Arbeitsmappe speichern, damit nicht zu verlieren, einen Teil der Arbeit.
Verwendet = "... im Einsatz, dh den Abschnitt, der enthält Daten oder das formatieren" oder bedingte Formatierung.
Gleiche wie 2., aber auch in Zellen, die das Ziel für jede Bedingte Formatierung Regel.
So finden Sie die Letzte verwendete Zelle hängt davon ab, was Sie wollen (Ihr Kriterium).
Für Kriterium 1, ich schlage vor, Lesen diese Antwort.
Beachten Sie, dass
UsedRange
zitiert als unzuverlässig. Ich denke, das ist irreführend sind (d.h., "unfair" zuUsedRange
), alsUsedRange
ist einfach nicht dazu gedacht, den Bericht der letzten Zelle mit Daten. So sollte es nicht verwendet werden, in diesem Fall, wie oben in dieser Antwort. Siehe auch dieser Kommentar.Für Kriterium 2,
UsedRange
ist die zuverlässigste option, als im Vergleich zu anderen Optionen auch ausschließlich für diese zu verwenden. Es macht es sogar überflüssig, eine Arbeitsmappe zu speichern, um sicherzustellen, dass die Letzte Zelle aktualisiert wird.Strg+ wird gehen Sie auf eine falsche Zelle vor dem speichern
("Die Letzte Zelle nicht zurückgesetzt, bis Sie das Arbeitsblatt speichern", aus
http://msdn.microsoft.com/en-us/library/aa139976%28v=office.10%29.aspx.
Es ist eine alte Referenz, aber in dieser Hinsicht gültig ist).
Für Kriterium 3, ich kenne keine integrierte Methode.
Kriterium 2 nicht berücksichtigt, für die Bedingte Formatierung. Kann man formatierte Zellen, basierend auf Formeln, die nicht erkannt werden von
UsedRange
oder Strg+.In der Abbildung, die Letzte Zelle B3, da die Formatierung angewendet wurde explizit auf Sie. Zellen B6:D7 format-abgeleitet eine Bedingte Formatierung Regel, und dieser wird nicht erkannt, auch durch
UsedRange
.Buchhaltung für diese würde es erfordern, dass einige VBA-Programmierung.
Als auf Ihre spezielle Frage:
Was ist der Grund dafür?
Ihrem code verwendet die erste Zelle im Bereich E4:E48 wie ein Trampolin, für springen unten mit
End(xlDown)
.Den "falschen" Ausgang erhalten, wenn es keine nicht-leere Zellen in Ihrem Sortiment außer vielleicht die erste. Dann sind Sie Sprung in den dunklen, d.h., unten im Arbeitsblatt
(beachten Sie den Unterschied zwischen leer und leere Zeichenfolge!).
Beachten Sie, dass:
Wenn Sie Ihre Auswahl enthält nicht-zusammenhängende nicht-leere Zellen, dann wird es auch ein Falsches Ergebnis.
Wenn es nur eine nicht-leere Zelle, aber es ist nicht der erste, der code wird immer noch geben Ihnen das richtige Ergebnis.
InformationsquelleAutor sancho.s
Habe ich diese one-stop Funktion für Ermittlung der letzten Zeile, Spalte und Zelle, sei es für Daten, formatiert (zusammengefasst/kommentiert/versteckte) Zellen oder bedingte Formatierung.
Ergebnisse sehen wie folgt aus:
Weitere detaillierte Ergebnisse, die einige Zeilen im code auskommentiert werden:
Eine Einschränkung vorhanden ist - wenn es Tabellen gibt, in der Blatt -, können die Ergebnisse unzuverlässig werden, so ich entschieden, um zu vermeiden, läuft der code in diesem Fall:
InformationsquelleAutor ZygD
Einen wichtigen Hinweis zu beachten bei der Lösung ...
... ist, um sicherzustellen, dass Ihre
LastRow
variable ist derLong
Typ:Sonst werden Sie am Ende bekommen-OVERFLOW-Fehler in bestimmten Situationen .XLSX-Arbeitsmappen
Dies ist mein gekapselte Funktion, die ich drop-in-verschiedenen-code verwendet.
InformationsquelleAutor Bishop
Ich würde hinzufügen, um die Antwort Siddarth dem Router sagen, dass die CountA-Aufruf übersprungen werden kann, indem er Finden Rücksendung ein Range-Objekt, anstatt eine Zeilennummer ein, und testen Sie dann das zurückgegebene Range-Objekt zu sehen, wenn es Nichts (leeres Arbeitsblatt).
Auch, ich hätte meine version eines LastRow Prozedur eine null für ein leeres Arbeitsblatt kopiert haben, dann kann ich wissen, es ist leer.
InformationsquelleAutor no comprende
Ich wundere mich, dass niemand erwähnt hat, Aber der einfachste Weg, um die letzten verwendeten Zelle ist:
Dies ist im wesentlichen gibt die gleiche Zelle, die Sie erhalten, indem Sie Strg + nach der Auswahl der Zelle
A1
.Ein Wort der Vorsicht: Excel merkt sich das die meisten unteren rechten Zelle, die war je in einem Arbeitsblatt. Also, wenn zum Beispiel geben Sie etwas in B3 und etwas anderes in H8 und dann später löschen Sie den Inhalt des H8, drücken Sie Strg + wird noch dauern, Sie zu H8 Zelle. Die oben genannten Funktion wird das gleiche Verhalten haben.
Last Cell
in Excel bezieht sich manchmal auf eine leere Zelle (vonUsed Range
) , unterscheidet sich vonLast Used Cell
;).Die OP brauchte nur die Letzte Zeile, aber Sie haben Recht, die Letzte Zelle sollte H5; Aber Sie können testen Sie Ihre Funktion nach dem löschen der Wert in A5 Sie werden sehen, dass die Letzte Zelle, eine leere Zelle, und ich denke, dein code braucht einige änderungen, wie, dass
Cells(1,1).Select()
ist ungültig es ist vielleichtActiveSheet.Cells(1,1).Select
; Auch in VBA ist es nicht empfohlen, die VerwendungSelect
;).Das bricht beiden hauptsächlichen Regeln für Excel-VBA: Don ' T Select! Und nicht davon ausgehen, Blatt-Sie will und wird aktiv.
InformationsquelleAutor dotNET
Da die original-Frage ist über Probleme mit der Suche nach der letzten Zelle, in dieser Antwort werde ich eine Liste der verschiedenen Möglichkeiten, können Sie unerwartete Ergebnisse erhalten; siehe meine Antwort an "Wie finde ich die Letzte Zeile, die Daten enthält, in das Excel-Tabellenblatt mit einem makro?" für mein nehmen auf die Lösung.
Werde ich beginnen, durch den ausbau auf die Antwort von sancho.s und der Kommentar von GlennFromIowa, indem noch mehr detail:
Andere Dinge möchten Sie vielleicht zu berücksichtigen:
Mit dem im Verstand, lassen Sie uns sehen,, wie der gemeinsame Weg die "Letzte Zelle" kann zu unerwarteten Ergebnissen:
.End(xlDown)
code aus der Frage zu brechen die meisten einfach (z.B. mit einem einzigen nicht-leeren Zelle oder wenn es leere Zellen zwischen) für die Gründe erläutert in die Antwort von Siddharth Rout hier (Suche nach "xlDown ist ebenso unzuverlässig.") ?Count
ing (CountA
oderCells*.Count
) oder.CurrentRegion
wird auch brechen in Anwesenheit von leeren Zellen oder Zeilen ?.End(xlUp)
die Suche rückwärts vom Ende einer Spalte, so wie bei STRG+UP, look für Daten (Formeln produzieren einen leeren Wert sind als "Daten") in sichtbaren Zeilen (so mit es mit autofilter aktiviert möglicherweise falsche Ergebnisse ⚠️).Müssen Sie darauf achten, dass die standard-fallen (für details werde ich wieder finden die Antwort von Siddharth Rout hier suchen Sie nach dem "Finde Letzte Zeile in einer Spalte" Abschnitt), wie hard-coding der letzten Zeile (
Range("A65536").End(xlUp)
), anstatt sich aufsht.Rows.Count
..SpecialCells(xlLastCell)
ist äquivalent zu STRG+ENDE, wieder die unteren und am rechten Zelle der "Bandbreite", also alle Vorsichtsmaßnahmen, die für die Berufung auf die "used range", für diese Methode als gut. Neben der "Bandbreite" wird nur zurückgesetzt, wenn das speichern der Arbeitsmappe und beim Zugriff aufworksheet.UsedRange
, soxlLastCell
produzieren könnten, veraltete Ergebnisse⚠️ mit nicht gespeicherten änderungen (z.B. nach einigen Zeilen gelöscht wurden). Finden Sie die in der Nähe Antwort von dotNET.sht.UsedRange
(beschrieben im detail in die Antwort von sancho.s hier) der Ansicht, sowohl Daten als auch Formatierung (wenn auch nicht die bedingte Formatierung) und setzt die "Bandbreite" des Arbeitsblatts, die möglicherweise oder möglicherweise nicht, was Sie wollen.Beachten Sie, dass ein häufiger Fehler ️ist die Verwendung
.UsedRange.Rows.Count
⚠️, gibt die Anzahl der Zeilen im verwendeten Bereich, nicht die Letzte Zeile (Sie wird anders sein, wenn die ersten paar Zeilen sind leer), für details siehe newguy Antwort auf Wie finde ich die Letzte Zeile, die Daten enthält, in das Excel-Tabellenblatt mit einem makro?.Find
ermöglicht das finden der letzten Zeile mit Daten (einschließlich Formeln) oder ein nicht-leerer Wert in jeder Spalte. Sie können wählen, ob Sie interessiert sind, die Formeln oder Werte, aber der Haken ist, dass es werden die Standardeinstellungen, die im Excel - Dialogfeld "Suchen" ️️⚠️, das kann sehr verwirrend für die Benutzer. Es muss auch mit bedacht eingesetzt werden, siehe die Antwort von Siddharth Rout hier (Abschnitt "Finde Letzte Zeile auf Blatt")Cells
' in einer Schleife werden in der Regel langsamer als der re-mit Hilfe einer Excel-Funktion (obwohl noch performant), aber lassen Sie Sie genau angeben, was Sie wollen, zu finden. Sehen meine Lösung basierend aufUsedRange
- und VBA-arrays zu finden, die Letzte Zelle mit Daten in der angegebenen Spalte-es Griffe ausgeblendete Zeilen, Filter blanks, nicht ändern, die Finden defaults und ist Recht performant.Welche Lösung auch immer Sie wählen, seien Sie vorsichtig
Long
stattInteger
zum speichern der Zeilennummern (um zu vermeiden, immerOverflow
mit mehr als 65k Zeilen) undDim ws As Worksheet ... ws.Range(...)
stattRange(...)
).Value
(das ist einVariant
) vermeiden Sie implizite Typumwandlungen wie.Value <> ""
wie Sie scheitern wird, wenn die Zelle einen Fehlerwert.InformationsquelleAutor Nickolay
"hier a65536 ist die Letzte Zelle in der Spalte a dieser code wurde getestet unter excel sti72003"200
und wenn u mit Ihrer
"a1,048,576"
mein code ist gerade für Anfänger zu verstehen, die Konzepte von dem, was end(xlup) und andere Verwandte Befehle tun können
Während diese Antwort ist wohl richtig und nützlich ist, ist es bevorzugt, wenn Sie einige Erläuterung zusammen mit es um zu erklären, wie es hilft, das problem zu lösen. Dies wird besonders nützlich sein in der Zukunft, wenn es zu einer änderung (möglicherweise nicht), die bewirkt, dass es aufhören zu arbeiten und die Nutzer müssen verstehen, wie es einst arbeitete.
Ich, entschuldigt, ich habe korrigiert meine Fehler ....
InformationsquelleAutor Ashwith Ullal
Allerdings ist diese Frage sucht, um zu finden, die Letzte Zeile mittels VBA, ich denke, es wäre gut, um eine array Formel für die Arbeitsblatt-Funktion wie diese bekommt Häufig besucht:
Müssen Sie die Formel ohne die Klammern und drücken Sie dann Shift + Strg + Enter, um das array Formel.
Dieser wird Ihnen die Adresse der letzten benutzten Zelle in der Spalte D.
InformationsquelleAutor M-M
War ich auf der Suche nach einem Weg, zu imitieren, die STRG+Shift+, so dass dotNET-Lösung ist groß, außer mit meinen Excel 2010-ich muss noch ein
set
wenn ich vermeiden will, einen Fehler:und wie um dies selbst zu überprüfen:
InformationsquelleAutor J. Chomel
InformationsquelleAutor user85489
Für die letzten 3+ Jahre dies sind die Funktionen, die ich benutze zum suchen der letzten Zeile und letzten Spalte pro definierten Spalte(row) und Spalte(column):
Letzte Spalte:
Letzte Zeile:
Für den Fall des OP, das ist der Weg, um die Letzte Zeile in Spalte
E
:Debug.Print lastRow(columnToCheck:=Range("E4:E48").Column)
InformationsquelleAutor Vityata