Простой код Lastrow, скопированный с других, не работает?

Код четко открывает рабочую книгу и рабочий лист (с четырьмя строками данных).... но затем ОСТАНАВЛИВАЕТСЯ на "Lastrow = Cells..." с ошибкой 91 "Переменная объекта или переменная блока не установлена".

Dim Lastrow As Long, NumPickups As Integer

Workbooks.Open Filename:="C:\Users\dads\Downloads\Donation Data.xlsm"

Worksheets("DonationDataQuery").Activate

Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row

NumPickups = Lastrow - 1

Range(Cells(1, 1), Cells(Lastrow, 22)).Select

Selection.Copy

Windows("test.xlsm").Activate

Range("J1").Select

ActiveSheet.Paste

Windows("Donation Data.xlsm").Activate

Пересмотренный подход к коду на основе комментария ниже:

Private Sub GeneratePickupData_Click()

'Open the Donation Data.xlsm and copy the data to this worksheet

Workbooks.Open Filename:="C:\Users\dads\Downloads\Donation Data.xlsm"
Worksheets("DonationDataQuery").Activate

'covert numbers brought over by Acess as text to numbers

Range("A1:O50").Select
    With Selection
        Selection.NumberFormat = "General"
        .Value = .Value
    End With

Dim Lastrow As Long, NumPickups As Integer

Lastrow = 0
NumPickups = 0

''Lastrow = Cells.Find("*", [A1], , , xlByRows, xlPrevious).Row
Lastrow = Range("A1").End(xlDown).Row

NumPickups = Lastrow - 1

'Range(Cells(1, 1), Cells(Lastrow, 22)).Select
Range("A1", Range("A1").SpecialCells(xlLastCell)).Select

Range("A1:V50").Select

Selection.Copy

Windows("Pickup Form Gen 2.xlsm").Activate

Range("J1").Select

ActiveSheet.Paste

Windows("Donation Data.xlsm").Activate


ActiveSheet.UsedRange.ClearContents

ActiveWorkbook.Save

ActiveWindow.Close


person Michael    schedule 18.02.2015    source источник
comment
Попробуйте: Lastrow = Cells.Find(*, Range(A1), xlValues, , xlByRows, xlPrevious).Row   -  person Tragamor    schedule 19.02.2015
comment
Вы используете только столбец 1 или столбец 22, поэтому вы можете найти последнюю строку в одном из этих столбцов.: lastrow=Cells(Rows.Count, "A").End(xlUp).Row или lastrow=cells(rows.count,22).end(xlup).row   -  person Davesexcel    schedule 19.02.2015


Ответы (2)


Если на вашем листе нет ячейки со знаком «*» внутри, Cells.Find("*", [A1], , , xlByRows, xlPrevious) будет нулевым. Если вы затем сошлетесь на .Row, вы получите описанную вами ошибку.

Похоже, вы пытаетесь найти последнюю заполненную строку на листе. Код ниже даст вам последнюю строку в столбце «A» с содержимым:

LastRow = Range("A1").End(xlDown).Row

Обратите внимание, что если вы хотите выбрать все элементы на листе, это даст вам диапазон, содержащий все заполненные ячейки:

Dim allCells As Range
Set allCells = Range("A1", Range("A1").SpecialCells(xlLastCell))

Оба этих фрагмента кода были созданы путем записи макроса, выбора ячейки "A1" и нажатия клавиш Ctrl+Down и Ctrl+Shift+Конец соответственно. Запись макросов — отличный способ запустить любую функцию vba!

person Simon MᶜKenzie    schedule 19.02.2015
comment
Спасибо... заменил код. Однако теперь код останавливается на Range(Cells(1, 1), Cells(Lastrow, 22)). Выберите с ошибкой 1004: Application-Defined или Object-Defined error. По мере прохождения я замечаю, что LastRow становится = 2, хотя должно быть 4, так как я проверил таблицу значений (4 строки, 22 столбца)... это базар! - person Michael; 19.02.2015
comment
Может быть, вместо Range(Cells(1, 1), Cells(Lastrow, 22)).Select (что мне в любом случае подходит) стоит использовать Range("A1", Range("A1").SpecialCells(xlLastCell)).Select... - person Simon MᶜKenzie; 19.02.2015
comment
Это выглядит как большая проблема. Таблица пожертвований.xlsm была экспортирована Access 2007 в результате запроса; данные хранятся в листе DonationDataQuery. Заметил, что все числовые поля отмечены зеленым треугольником — числа хранятся в виде текста. Это было необходимо, так как данные вводили люди с нарушениями зрения. Теперь, когда я пытаюсь открыть лист и исправить проблему с текстом в число, используя код, добавленный выше, он останавливается на диапазоне (A1: O50). Выберите с ошибкой 1004... теперь придется опубликовать еще один вопрос :( - person Michael; 19.02.2015
comment
Имеет ли лист ограниченное количество столбцов? Я не понимаю, почему Range("A1:O50").Select потерпит неудачу, если на вашем листе нет ячейки "O50", что я не думаю, что это возможно, или если какой-то выбор невозможен (т.е. лист потерял фокус)... - person Simon MᶜKenzie; 19.02.2015
comment
Спасибо за вклад ... Я пытался открыть другой файл и запустить некоторый код в этом файле, скопировать результаты и вернуть его обратно в мою текущую книгу ... слишком много проблем, поэтому просто скопировал данные и закрыл файл, затем вставлен в текущую книгу и манипулировал данными в текущей книге .... проблема решена. - person Michael; 22.02.2015

Судя по вашим ошибкам, я бы предположил, что ваш код находится в модуле кода рабочего листа, и поэтому все ваши вызовы Range и Cells относятся к этому листу, если они не квалифицированы с помощью объекта рабочего листа. Попробуйте это вместо этого:

Dim Lastrow               As Long
Dim NumPickups            As Long
Dim rFound                As Range

With Workbooks.Open(Filename:="C:\Users\dads\Downloads\Donation Data.xlsm").Worksheets("DonationDataQuery")

    Set rFound = .Cells.Find("*", .Range("A1"), , , xlByRows, xlPrevious)
    If rFound Is Nothing Then
        Lastrow = 2
    Else
        Lastrow = rFound.Row
    End If

    NumPickups = Lastrow - 1

    .Range(.Cells(1, 1), .Cells(Lastrow, 22)).Copy Destination:=Workbooks("test.xlsm").ActiveSheet.Range("J1")

End With
person Rory    schedule 19.02.2015