HINWEIS : Ich beabsichtige, dies zu einem "One-Stop-Post" zu machen Correct
, auf dem Sie die letzte Zeile finden können. Dies umfasst auch die Best Practices, die beim Auffinden der letzten Zeile zu befolgen sind. Und daher werde ich es weiter aktualisieren, wenn ich auf ein neues Szenario / eine neue Information stoße.
Unzuverlässige Wege, um die letzte Zeile zu finden
Einige der gebräuchlichsten Methoden zum Auffinden der letzten Zeile, die sehr unzuverlässig sind und daher niemals verwendet werden sollten.
- UsedRange
- xlDown
- CountA
UsedRange
sollte NIEMALS verwendet werden, um die letzte Zelle mit Daten zu finden. Es ist sehr unzuverlässig. Versuchen Sie dieses Experiment.
Geben Sie etwas in die Zelle ein A5
. Wenn Sie nun die letzte Zeile mit einer der unten angegebenen Methoden berechnen, erhalten Sie 5. Färben Sie nun die Zelle A10
rot. Wenn Sie jetzt einen der folgenden Codes verwenden, erhalten Sie immer noch 5. Wenn Sie verwenden, Usedrange.Rows.Count
was erhalten Sie? Es wird nicht 5 sein.
Hier ist ein Szenario, um zu zeigen, wie es UsedRange
funktioniert.
xlDown
ist ebenso unzuverlässig.
Betrachten Sie diesen Code
lastrow = Range("A1").End(xlDown).Row
Was würde passieren, wenn es nur eine Zelle ( A1
) gäbe, die Daten enthält? Am Ende erreichen Sie die letzte Zeile im Arbeitsblatt! Es ist so, als würde man eine Zelle auswählen A1
und dann die EndTaste drücken und dann die Down ArrowTaste drücken . Dies führt auch zu unzuverlässigen Ergebnissen, wenn sich leere Zellen in einem Bereich befinden.
CountA
ist auch unzuverlässig, da es zu falschen Ergebnissen führt, wenn dazwischen leere Zellen liegen.
Und daher sollte man die Verwendung von vermeiden UsedRange
, xlDown
und CountA
die letzte Zelle zu finden.
Finde die letzte Zeile in einer Spalte
Verwenden Sie diese Option, um die letzte Zeile in Spalte E zu finden
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Wenn Sie bemerken, dass wir eine .
vorher haben Rows.Count
. Wir haben das oft ignoriert. Siehe DIESE Frage zu dem möglichen Fehler, den Sie möglicherweise erhalten. Ich rate immer .
vor Rows.Count
und Columns.Count
. Diese Frage ist ein klassisches Szenario, in dem der Code aufgrund der Rows.Count
Rückgabe 65536
für Excel 2003 und früher sowie 1048576
für Excel 2007 und höher fehlschlägt . Ebenso Columns.Count
gibt 256
und 16384
, respectively.
Die obige Tatsache, dass Excel 2007+ 1048576
Zeilen enthält, unterstreicht auch die Tatsache, dass wir immer die Variable deklarieren sollten, die den Zeilenwert enthält, da Long
stattdessen Integer
eine Overflow
Fehlermeldung angezeigt wird .
Beachten Sie, dass bei diesem Ansatz alle ausgeblendeten Zeilen übersprungen werden. Im Rückblick auf meinem Screenshot oben für Spalte A , wenn Zeile 8 versteckt waren, würde dieser Ansatz zurückkehrt 5
statt 8
.
Finde die letzte Reihe in einem Blatt
Effective
Verwenden Sie diese Option, um die letzte Zeile im Blatt zu finden . Beachten Sie die Verwendung von Application.WorksheetFunction.CountA(.Cells)
. Dies ist erforderlich, denn wenn das Arbeitsblatt keine Zellen mit Daten enthält .Find
, erhalten Sie dieseRun Time Error 91: Object Variable or With block variable not set
With Sheets("Sheet1")
If Application.WorksheetFunction.CountA(.Cells) <> 0 Then
lastrow = .Cells.Find(What:="*", _
After:=.Range("A1"), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
Else
lastrow = 1
End If
End With
Letzte Zeile in einer Tabelle suchen (ListObject)
Die gleichen Prinzipien gelten zum Beispiel, um die letzte Zeile in der dritten Spalte einer Tabelle zu erhalten:
Sub FindLastRowInExcelTableColAandB()
Dim lastRow As Long
Dim ws As Worksheet, tbl as ListObject
Set ws = Sheets("Sheet1") 'Modify as needed
'Assuming the name of the table is "Table1", modify as needed
Set tbl = ws.ListObjects("Table1")
With tbl.ListColumns(3).Range
lastrow = .Find(What:="*", _
After:=.Cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
End With
End Sub