Как определить последнюю строку, используемую в VBA, включая пробелы между

30

Как определить последнюю строку в листе Excel, включая некоторые пустые строки в середине?

С помощью этой функции:

Function ultimaFilaBlanco(col As String) As Long        
        Dim lastRow As Long
        With ActiveSheet
            lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row
        End With            
        ultimaFilaBlanco = lastRow          
End Function

И эти данные:

Row 1 : Value
Row 2 : Value
Row 3 : Value
Row 4 : Value
Row 5 : Value
Row 6 : White
Row 7 : Value
Row 8 : Value
Row 9 : Value
Row 10  : White
Row 11  : White
Row 12  : White
Row 13  : Value
Row 14  : White

Функция возвращает 5, и мне нужно 13. Любая идея, как это сделать?

  • 3
    Дубликат последней не пустой ячейки в строке; Excel VBA
  • 1
    Будьте осторожны, UsedRange.Rows.Count возвращает количество строк, использованных когда-либо . Если вы используете 100 строк, а затем clearcontents UsedRange.Row.Count прежнему возвращает 100.
Показать ещё 2 комментария
Теги:
excel

12 ответов

14
Лучший ответ

Ты действительно рядом. Попробуйте использовать большой номер строки с помощью End(xlUp)

Function ultimaFilaBlanco(col As String) As Long

        Dim lastRow As Long
        With ActiveSheet
            lastRow = ActiveSheet.Cells(1048576, col).End(xlUp).row
        End With

        ultimaFilaBlanco = lastRow

End Function
  • 0
    Эй, спасибо, я тестирую, Знаете ли вы, почему я должен вернуть вариант, а не длинный?
  • 0
    Хммм я тестировал в другом макросе и работает: S
Показать ещё 1 комментарий
53

Лучший способ получить номер последней используемой строки:

ActiveSheet.UsedRange.Rows.Count для текущего листа.

Worksheets("Sheet name").UsedRange.Rows.Count для конкретного листа.

Чтобы получить номер последнего используемого столбца:

ActiveSheet.UsedRange.Columns.Count для текущего листа.

Worksheets("Sheet name").UsedRange.Columns.Count для конкретного листа.

Надеюсь, это поможет.

Абдо

  • 1
    Благодарю. Это работает быстрее, как я знаю. Я бы принял это как ответ.
  • 5
    Это работает, только если первой непустой строкой является строка 1.
Показать ещё 1 комментарий
15

Я использую следующее:

lastrow = ActiveSheet.Columns("A").Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

Он найдет последнюю строку в определенном столбце. Если вы хотите использовать последнюю использованную строку для любого столбца, то:

lastrow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row
  • 0
    ClearContents ... Работает нормально даже с ClearContents или удалением дубликатов
14
ActiveSheet.UsedRange.Rows.Count + ActiveSheet.UsedRange.Rows(1).Row -1

Short. Безопасно. Быстро. Вернет последнюю непустую строку, даже если на верхней части листа есть пустые строки или где-нибудь еще. Работает также для пустого листа (Excel сообщает 1 используемую строку на пустом листе, поэтому выражение будет равно 1). Протестировано и работает в Excel 2002 и Excel 2010.

  • 1
    Это, безусловно, должен быть самый точный ответ. Ответы Count предполагают, что вы начинаете с первого ряда (т. Е. 1) - бывают случаи, когда вас нет. Это дает вам фактический индекс строки, на котором заканчивается диапазон. Я бы принял это как ответ.
  • 0
    @ manuel ваше заявление отлично справилось с пустыми строками, можете ли вы это немного уточнить
Показать ещё 1 комментарий
10

Будьте осторожны, UsedRange.Rows.Count возвращает количество строк, используемых когда-либо. Если вы используете 100 строк, а затем clearcontents UsedRange.Row.Count все еще возвращает 100.

3

Проблема - это "как строка" в вашей функции. Замените его "как двойной" или "как долго", чтобы он работал. Таким образом, это даже работает, если последняя строка больше, чем "большое число", предложенное в принятом ответе.

Итак, это должно работать

Function ultimaFilaBlanco(col As double) As Long        
    Dim lastRow As Long
    With ActiveSheet
        lastRow = ActiveSheet.Cells(ActiveSheet.Rows.Count, col).End(xlUp).row
    End With            
    ultimaFilaBlanco = lastRow          
End Function
3
LastRow = ActiveSheet.UsedRange.Rows.Count
1

Хорошо, кроме всех упомянутых, существует несколько других способов найти последнюю строку или столбец в листе или заданном диапазоне.

Function FindingLastRow(col As String) As Long

  'PURPOSE: Various ways to find the last row in a column or a range
  'ASSUMPTION: col is passed as column header name in string data type i.e. "B", "AZ" etc.

   Dim wks As Worksheet
   Dim lstRow As Long

   Set wks = ThisWorkbook.Worksheets("Sheet1") 'Please change the sheet name
   'Set wks = ActiveSheet   'or for your problem uncomment this line

   'Method #1: By Finding Last used cell in the worksheet
   lstRow = wks.Range("A1").SpecialCells(xlCellTypeLastCell).Row

   'Method #2: Using Table Range
   lstRow = wks.ListObjects("Table1").Range.Rows.Count

   'Method #3 : Manual way of selecting last Row : Ctrl + Shift + End
   lstRow = wks.Cells(wks.Rows.Count, col).End(xlUp).Row

   'Method #4: By using UsedRange
   wks.UsedRange 'Refresh UsedRange
   lstRow = wks.UsedRange.Rows(wks.UsedRange.Rows.Count).Row

   'Method #5: Using Named Range
   lstRow = wks.Range("MyNamedRange").Rows.Count

   'Method #6: Ctrl + Shift + Down (Range should be the first cell in data set)
   lstRow = wks.Range("A1").CurrentRegion.Rows.Count

   'Method #7: Using Range.Find method
   lstRow = wks.Column(col).Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row

   FindingLastRow = lstRow

End Function

Примечание. Используйте только один из приведенных выше методов, так как он оправдывает вашу проблему.

Обратите внимание на то, что метод Find не видит форматирование ячейки, а только данные, поэтому ищите xlCellTypeLastCell, если важны только данные, а не форматирование. Кроме того, объединенные ячейки (которые следует избегать) могут дать вам неожиданные результаты, поскольку он даст вам номер строки первой ячейки, а не последнюю ячейку в объединенных ячейках.

0

Если лист содержит неиспользованную область сверху, UsedRange.Rows.Count не является максимальной строкой.

Это правильный максимальный номер строки.

maxrow = Sheets("..name..").UsedRange.Rows(Sheets("..name..").UsedRange.Rows.Count).Row
0
ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.count).row

ActiveSheet можно заменить WorkSheets(1) или WorkSheets("name here")

-1

Лучше:

if cells(i,1)="" then 
nextEmpty=i: 
exit for
  • 0
    Немного опоздал на вечеринку .... хотя я согласен, что Exit For будет лучше, чем GoTo 20 - я предполагаю, что вы отвечаете на ответ, данный @OdiljonJakhangirov. Но - код для Ctrl+Up быстрее, чем метод Find .
-1

вот мой код, чтобы найти следующую пустую строку, например, в первой строке 'A'. Чтобы использовать его для любой другой строки, просто меняйте ячейки (i, 2 или 3 или 4 так далее)

Sheets("Sheeet1").Select
   for i=1 to 5000
        if cells(i,1)="" then nextEmpty=i goto 20
   next i
20 'continue your code here 

enter code here

Ещё вопросы

Сообщество Overcoder
Наверх
Меню