Автор Тема: Excel VBA: поиск последней строки на листе.  (Прочитано 1363 раз)

Оффлайн Администратор

  • Administrator
  • Сообщений: 1641
Поиск последней строки без учёта оформления

В этом случае в экселе нет инструментов и нужно что-то изобретать.

Если надо искать последнюю строку по одному столбцу
Способ 1. Использование метода "End"

Недостатки:
1) не ищет в скрытых строках;
2) если есть умная таблица, то ищет до неё. Если например, столбец пустой, то будет найден низ таблицы, а не шапка таблицы.

Поиск последней строки в столбце A:
Sub Макрос()
    Dim lr As Long
    lr = Cells(Rows.Count, "A").End(xlUp).Row
End Sub

Способ 2. Использование эксель-функции "ПОИСКПОЗ" (Match)

Недостатки: если в столбце могут быть и числа и текст, то нужно писать громоздкий код.

Я не привожу пример поиска, если в столбце может быть текст и числа.

Поиск в столбце A, если в столбце A только текст (числа не будут учитываться):
Sub Макрос()
    Dim lr As Long
    On Error Resume Next
    lr = WorksheetFunction.Match("""", Columns("A"), -1)
    On Error GoTo 0
End Sub

Поиск в столбце A, если в столбце A только числа (тест не будет учитываться):
Sub Макрос()
    Dim lr As Long
    On Error Resume Next
    lr = WorksheetFunction.Match(1E+306, Columns("A"), 1)
    On Error GoTo 0
End Sub
Если надо искать последнюю строку по нескольким столбцам
Для этого нужно использовать метод "Find".

Детали:
1) Код с использованием метода "Find" можно получать макрорекордером, а затем корректировать.
2) Нужно указывать все параметры метода "Find", иначе метод "Find" возьмёт настройки из диалога "Найти и заменить".
3) LookIn:=xlFormulas позволяет искать в скрытых ячейках.
4) Метод "Find" не ищет в объединённых ячейках.

Поиск последней строки на всём листе. Если лист пустой, то будет run-ошибка, поэтому может потребоваться добавить перехватчик ошибок "On Error".

Sub Макрос()
    Dim lr As Long
    lr = Cells.Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
End Sub
Другие принципы поиска
Если перечисленные  способы вам не подходят по каким-то причинам, то можно делать следующее.

1. Копируйте данные из экселя в vba-массив, а затем в цикле двигайтесь по массиву снизу вверх до первой непустой ячейки. В vba-массив надо копировать, т.к. с vba-массивом макрос быстрее работает.
Прежде чем копировать в массив, найдите последнюю строку с учётом оформления.

2. Если данных у вас на листе мало, то можно вообще двигаться циклом по столбцу по ячейкам до первой пустой ячейки.

3. Можете придумывать свои способы, если перечисленные способы вам не подходят.


Поиск последней строки с учётом оформления

В этом случае в экселе есть инструменты. Но оба инструмента ищут на целом листе, то есть в заданных диапазонах нельзя найти, поиск будет вестись по всему листу.

Спойлер
Способ 1. Использование "UsedRange"

Поиск последней строки на всём листе
Sub Макрос()
    Dim lr As Long
    lr = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count - 1
End Sub

Способ 2. Использование "SpecialCells"

В этом способе есть брак программы "Excel": если на листе были данные и они удалены, но вы ещё не щёлкали "Сохранить", то SpecialCells будет искать с учётом старых данных, которых уже нет на листе. Поэтому нужно сделать "With ActiveSheet.UsedRange: End With", что обновит данные.

Поиск последней строки на всём листе:
Sub Макрос()
    Dim lr As Long
    With ActiveSheet.UsedRange: End With
    lr = Cells.SpecialCells(xlCellTypeLastCell).Row
End Sub