Я хотел бы скопировать диапазон ячеек в закрытой записной книжке, в которой нет статического набора строк. Я хотел бы скопировать его в активную книгу.
Я пытаюсь динамически скопировать все записи в столбце F из файла «test.xlsx» из рабочего листа «исключение». Макрос запускается без проблем, если вместо этого я использую статическую ссылку. Вот код, который я запускаю, он дает мне ошибку времени выполнения для строки, которая копирует данные.
Sub GetClassID()
Dim App As New Excel.Application
Dim wsActive As Worksheet
Set wsActive = ThisWorkbook.ActiveSheet
Dim wbImport As Workbook
Set wbImport = App.Workbooks.Open(Filename: = "C:\Test.xlsx",
UpdateLinks:=True, ReadOnly:=True)
wbImport.Worksheets("Exception").Range("F2",Range("F2").end(xldown)).Copy
wsActive.Range("A2").PasteSpecial Paste:=xlPasteFormats
wsActive.Range("A2").PasteSpecial Paste:=xlPasteValues
App.CutCopyMode = False
wbImport.Close SaveChanges:=False
App.Quit
End Sub
Ошибка, которую я получаю, это ошибка времени выполнения «1004»: интерфейс не зарегистрирован
Предполагая, что вы запускаете это в Excel VBA? Вам не нужно открывать другую книгу как Excel.Application
, просто удалите из нее app
и откройте книгу как обычно:
Sub GetClassID()
Dim wsActive As Worksheet
Set wsActive = ThisWorkbook.Sheets("Another Sheet Name")
Dim wbImport As Workbook
Set wbImport = Workbooks.Open(Filename: = "C:\Test.xlsx", UpdateLinks:=True, ReadOnly:=True)
With wbImport.Worksheets("Exception")
.Range("F2", .Range("F2").End(xlDown)).Copy
End With
wsActive.Range("A2").PasteSpecial Paste:=xlPasteFormats
wsActive.Range("A2").PasteSpecial Paste:=xlPasteValues
App.CutCopyMode = False
wbImport.Close SaveChanges:=False
App.Quit
End Sub
Я использовал этот код, и он работал без проблем. Однако я хочу повторить этот точный набор команд для другого листа, но это не работает. Значения будут скопированы на долю секунды и исчезнут. Что мне нужно удалить/изменить из предоставленного кода, чтобы его можно было использовать для выполнения тех же действий на другом листе?
@Wayne_Chen измените Set wsActive = ThisWorkbook.ActiveSheet
на Set wsActive = ThisWorkbook.Sheets("Another Sheet Name")
, см. обновленный код с этим изменением.
По моему опыту, наиболее эффективный способ скопировать динамический диапазон — создать переменную как целое число и назначить строку последней копируемой ячейки (или столбец, если нужно выбрать строку данных до определенной точки). обычно выполняют это примерно так:
Dim R as Integer
With ThisWorkbook.Worksheets
R = .Cells(.Rows.Count, 1).End(xlUp).Row
End With
Затем вы можете подключить «R» для номера строки в диапазоне, чтобы сделать его динамическим при каждом запуске макроса. Например: .Range("A1:A" & R).Copy
скопирует используемый диапазон в столбце A. Это также позволяет очень легко ссылаться на последнюю строку для циклов и т. д. Непрерывно в вашем коде. Надеюсь это поможет!
Это может быть эталонная ошибка, но отдельно вам может понадобиться уточнить диапазон диапазона
...End(xlDown)
:wbImport.Worksheets("Exception").Range("F2",wbImport.Worksheets("Exception").Range("F2").end(xldown)).Copy