Короткий ответ: для конкретного столбца обычно достаточно Cells(Rows.Count, "A").End(xlUp).Row. Важно явно указать лист, иначе код проверит активный лист.
Последняя строка в заданном столбце
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Данные")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Код начинает с нижней ячейки столбца A и поднимается до первого непустого значения. Внутренние пропуски не мешают.
Правильно обработать пустой столбец
На полностью пустом столбце метод вернёт 1. Поэтому добавьте проверку:
If Application.WorksheetFunction.CountA(ws.Columns("A")) = 0 Then
lastRow = 0
Else
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
End If
Последняя используемая строка на всём листе
Если данные могут находиться в любом столбце, используйте поиск:
Dim lastCell As Range
Set lastCell = ws.Cells.Find(What:="*", After:=ws.Range("A1"), _
LookAt:=xlPart, LookIn:=xlFormulas, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False)
lastRow = IIf(lastCell Is Nothing, 0, lastCell.Row)
LookIn:=xlFormulas учитывает ячейки с формулами, даже если они показывают пустую строку.
Пример обработки диапазона
Dim r As Long
For r = 2 To lastRow
If Len(ws.Cells(r, "A").Value2) > 0 Then
ws.Cells(r, "B").Value = UCase$(CStr(ws.Cells(r, "A").Value))
End If
Next r
Почему не стоит полагаться на UsedRange
UsedRange иногда сохраняет строки, где раньше были данные или форматирование. Для бизнес-логики надёжнее выбрать обязательный столбец либо использовать Find.
Проверка макроса
Проверьте пустой лист, одну строку, пропуски внутри таблицы и данные в последней допустимой строке. Перед запуском на рабочей книге сохраните копию.