Динамически копировать диапазон ячеек из закрытой книги?

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

Я пытаюсь динамически скопировать все записи в столбце 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»: интерфейс не зарегистрирован

Это может быть эталонная ошибка, но отдельно вам может понадобиться уточнить диапазон диапазона ...End(xlDown): wbImport.Worksheets("Exception").Range("F2",wbImport.Workshe‌​ets("Exception").Ran‌​ge("F2").end(xldown)‌​).Copy

BruceWayne 28.05.2019 21:41
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
1
870
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Предполагая, что вы запускаете это в 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 29.05.2019 16:04

@Wayne_Chen измените Set wsActive = ThisWorkbook.ActiveSheet на Set wsActive = ThisWorkbook.Sheets("Another Sheet Name"), см. обновленный код с этим изменением.

FAB 29.05.2019 18:31

По моему опыту, наиболее эффективный способ скопировать динамический диапазон — создать переменную как целое число и назначить строку последней копируемой ячейки (или столбец, если нужно выбрать строку данных до определенной точки). обычно выполняют это примерно так:

Dim R as Integer
With ThisWorkbook.Worksheets
   R = .Cells(.Rows.Count, 1).End(xlUp).Row
End With

Затем вы можете подключить «R» для номера строки в диапазоне, чтобы сделать его динамическим при каждом запуске макроса. Например: .Range("A1:A" & R).Copy скопирует используемый диапазон в столбце A. Это также позволяет очень легко ссылаться на последнюю строку для циклов и т. д. Непрерывно в вашем коде. Надеюсь это поможет!

Другие вопросы по теме