Ошибка выполнения функции VBA Excel 1004: ошибка, определенная приложением или объектом

Я пытаюсь изучить функции с целью упрощения и повторного использования кода, когда это необходимо.

Я начал с того, что превратил то, что я часто использую, в функцию: возвращая целочисленное значение последнего непустого столбца в электронной таблице.

Function FindLastDataLine(strColName As String) As Long
    FindLastDataLine = Range(strColName).Offset(Rows.Count - 1, 0).End(xlUp).Row
End Function

Sub PracticeMacro()
    intItemCount = FindLastDataLine("A:A")
    MsgBox ("There are " & intItemCount & " rows of data in column A.")
End Sub

когда я запускаю это, я получаю ошибку времени выполнения "1004" ошибка, определенная приложением или объектом", которая помогает полезно определить как" чужую ошибку", чтобы процитировать не совсем дословно.

где может быть, я ошибаюсь?

29
задан Hennes
10.12.2022 17:59 Количество просмотров материала 2589
Распечатать страницу

4 ответа

почему ваш метод не работает: здесь есть две причины. Первый, когда ставишь 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
4
отвечен Breakthrough 2022-12-12 01:47

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

Если вы измените свою функцию на эту, я думаю, она будет работать:

Function FindLastDataLine(strColName As String) As Long
    FindLastDataLine = ActiveSheet.Cells(ActiveSheet.Rows.Count, strColName).End(xlUp).Row
End Function
1
отвечен PerryJ 2022-12-12 04:04

это может не исправить вашу ошибку, но вернет ItemCount в диапазоне...

Function FindLastDataLine(strColName As String) As Long
    FindLastDataLine = Evaluate("COUNTA(" & strColName & ")")
End Function

Sub PracticeMacro()
    intItemCount = FindLastDataLine("A:A")
    MsgBox ("There are " & intItemCount & " rows of data in column A.")
End Sub

обратите внимание, что есть и другие способы вызова этой функции COUNTA Excel...

1
отвечен Tiago Cardoso 2022-12-12 06:21

попробуй:

FindLastDataLine = _
     Range(strColName).Offset(ActiveSheet.Rows.Count - 1, 0).End(xlUp).Row

строки-свойство.

0
отвечен Lance Roberts 2022-12-12 08:38

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх