почему ваш метод не работает: здесь есть две причины. Первый, когда ставишь Rows.Count
, нет ссылки для Rows
- это свойство Range
. Чтобы исправить это, вы просто должны ссылаться на тот же диапазон, что и вы (просто добавьте его перед вызовом Rows.Count
такой:
Function FindLastDataLine(strColName As String) As Long
FindLastDataLine = Range(strColName).Offset(Range(strColName).Rows.Count - 1, 0).End(xlUp).Row
End Function
вторая причина в том, что вы используете Offset
. Offset
буквально сдвигает Range
на сколько ты рассказываешь. Вы не хотите перенести весь диапазон ячеек, но найдите последнюю ячейку в диапазоне. Вы можете сделать это довольно просто, изменив Offset
to Cells
, убрав первоначальный Range()
звонок (так как мы собираемся выбрать одну ячейку), и меняется 0
в нужную колонку. Тем не менее, потому что вы передаете столбец как "A:A"
, это невозможно, поэтому вам придется заменить его Range(strColName).Column
следующим образом:
Function FindLastDataLine(strColName As String) As Long
FindLastDataLine = Cells(Range(strColName).Rows.Count, Range(strColName).Column).End(xlUp).Row
End Function
лучшее решение: следующее решение будет работать на всех последние версии MS Office (2003, 2007 и 2010), и будет обрабатывать ошибки. Вы вызываете его, передавая либо букву столбца, либо номер столбца:
Function GetLastDataRow(col As Variant) As Long
GetLastDataRow = -1
If (IsNumeric(col) And col >= 1) Or Len(col) <= 2 Then
On Error Resume Next
GetLastDataRow = _
Cells(Cells(1, col).EntireColumn.Rows.Count, col).End(xlUp).Row
On Error GoTo 0
End If
End Function
ниже показано, как можно вызвать эту функцию и некоторые примеры выходных данных. Предположим, что весь лист чист, за исключением некоторых случайных данных, введенных в ячейках B1
to B8
и B10
(B9
оставить пустым). Обратите внимание, что столбец вводится не как диапазон, а как буква столбца или номер столбца (недопустимые значения возвращают -1):
GetLastDataRow(1) = 1 GetLastDataRow("A") = 1
GetLastDataRow(2) = 10 GetLastDataRow("B") = 10
GetLastDataRow("AX") = 1 GetLastDataRow("A:X") = -1
GetLastDataRow("Oops...") = -1 GetLastDataRow(200) = 1
как техническое примечание, если Cells
метод завершается неудачей, предполагается, что входные данные были недопустимы, поэтому функция возвращает -1. Я призываю вас использовать эту практику (возвращать недопустимые значения, если ввод был недопустимым) в вашей функции, это значительно поможет вам избежать ошибок в будущем.
как это работает, он находит последнюю строку в определенном столбце (В зависимости от вашей версии MS Office), а затем использует End
метод поиска последней ячейки в этом столбце с данными.
вот альтернативная версия, которая вернет 0, если все ячейки в этом столбце пусты:
Function GetLastDataRow(col As Variant) As Long
GetLastDataRow = -1
If (IsNumeric(col) And col >= 1) Or Len(col) <= 2 Then
On Error Resume Next
If IsEmpty(Cells(Cells(1, col).EntireColumn.Rows.Count, col).End(xlUp).Value) Then
GetLastDataRow = 0
Else
GetLastDataRow = _
Cells(Cells(1, col).EntireColumn.Rows.Count, col).End(xlUp).Row
End If
On Error GoTo 0
End If
End Function
пример:
GetLastDataRow(1) = 0 GetLastDataRow("A") = 0
GetLastDataRow(2) = 10 GetLastDataRow("B") = 10
GetLastDataRow("AX") = 0 GetLastDataRow("A:X") = -1
GetLastDataRow("Oops...") = -1 GetLastDataRow(200) = 0