UWAGA : Zamierzam uczynić z tego „postu z jednego miejsca”, w którym można znaleźć Correct
sposó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
UsedRange
powinna 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 A10
czerwono. Jeśli teraz użyjesz dowolnego z poniższych kodów, nadal otrzymasz 5. Jeśli skorzystasz z Usedrange.Rows.Count
tego, co otrzymasz? To nie będzie 5.
Oto scenariusz pokazujący, jak UsedRange
dział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ę, A1
a 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
, xlDown
i CountA
aby 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.Count
i Columns.Count
. To pytanie jest klasycznym scenariuszem, w którym kod zawiedzie, ponieważ Rows.Count
zwraca wyniki 65536
dla Excela 2003 i wcześniejszych oraz 1048576
dla Excela 2007 i późniejszych. Podobnie Columns.Count
zwraca 256
i 16384
odpowiednio.
Powyższy fakt, że Excel 2007+ ma 1048576
wiersze, podkreśla również fakt, że zawsze powinniśmy zadeklarować zmienną, która będzie przechowywać wartość wiersza, ponieważ Long
zamiast tego Integer
pojawi się Overflow
błą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 5
zamiast 8
.
Znajdź ostatni wiersz w arkuszu
Aby znaleźć Effective
ostatni 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 .Find
da 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