UWAGA : Zamierzam uczynić z tego „postu z jednego miejsca”, w którym można znaleźć Correctsposób, aby znaleźć ostatni wiersz. Dotyczy to również najlepszych praktyk, które należy stosować przy znajdowaniu ostatniego rzędu. Dlatego będę go aktualizować za każdym razem, gdy napotkam nowy scenariusz / informacje.
Niewiarygodne sposoby znalezienia ostatniego rzędu
Niektóre z najczęstszych sposobów znajdowania ostatniego rzędu, które są wysoce niewiarygodne i dlatego nigdy nie powinny być używane.
- UsedRange
- xlDown
- CountA
UsedRangepowinna nigdy być używane, aby znaleźć ostatnią komórkę, która ma dane. Jest wysoce zawodny. Wypróbuj ten eksperyment.
Wpisz coś w komórce A5. Teraz, kiedy obliczysz ostatni wiersz dowolną z metod podanych poniżej, da ci 5. Teraz pokoloruj komórkę na A10czerwono. Jeśli teraz użyjesz dowolnego z poniższych kodów, nadal otrzymasz 5. Jeśli skorzystasz z Usedrange.Rows.Counttego, co otrzymasz? To nie będzie 5.
Oto scenariusz pokazujący, jak UsedRangedziała.

xlDown jest równie niewiarygodne.
Rozważ ten kod
lastrow = Range("A1").End(xlDown).Row
Co by się stało, gdyby tylko jedna komórka ( A1) posiadała dane? W końcu dotrzesz do ostatniego wiersza w arkuszu! To tak, jakby wybrać komórkę, A1a następnie nacisnąć Endklawisz, a następnie nacisnąć Down Arrowklawisz. Zapewni to również niewiarygodne wyniki, jeśli w zakresie będą puste komórki.
CountA jest również niewiarygodna, ponieważ da ci niepoprawny wynik, jeśli pomiędzy nimi będą puste komórki.
A więc należy unikać stosowania UsedRange, xlDowni CountAaby znaleźć ostatnią komórkę.
Znajdź ostatni wiersz w kolumnie
Aby znaleźć ostatni wiersz w kolumnie E, użyj tego
With Sheets("Sheet1")
LastRow = .Range("E" & .Rows.Count).End(xlUp).Row
End With
Jeśli zauważysz, że mamy .wcześniej Rows.Count. Często zdecydowaliśmy się to zignorować. Zobacz TO pytanie dotyczące możliwego błędu, który możesz otrzymać. Zawsze radzę używać .przed Rows.Counti Columns.Count. To pytanie jest klasycznym scenariuszem, w którym kod zawiedzie, ponieważ Rows.Countzwraca wyniki 65536dla Excela 2003 i wcześniejszych oraz 1048576dla Excela 2007 i późniejszych. Podobnie Columns.Countzwraca 256i 16384odpowiednio.
Powyższy fakt, że Excel 2007+ ma 1048576wiersze, podkreśla również fakt, że zawsze powinniśmy zadeklarować zmienną, która będzie przechowywać wartość wiersza, ponieważ Longzamiast tego Integerpojawi się Overflowbłąd.
Zauważ, że to podejście spowoduje pominięcie ukrytych wierszy. Patrząc wstecz na mój zrzut ekranu powyżej dla kolumny A , jeśli wiersz 8 byłby ukryty, to podejście powróciłoby 5zamiast 8.
Znajdź ostatni wiersz w arkuszu
Aby znaleźć Effectiveostatni wiersz w arkuszu, użyj tego. Zwróć uwagę na użycie Application.WorksheetFunction.CountA(.Cells). Jest to wymagane, ponieważ jeśli nie ma komórek z danymi w arkuszu, to .Findda ciRun 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
Znajdź ostatni wiersz w tabeli (ListObject)
Obowiązują te same zasady, na przykład aby uzyskać ostatni wiersz w trzeciej kolumnie tabeli:
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