Использование Sheets.Copy приводит к ошибке автоматизации при попытке скопировать лист в переменную - PullRequest
0 голосов
/ 02 апреля 2020

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

Ошибка - ошибка автоматизации.

Вот мой код:

Dim fd As Office.FileDialog
Dim strFile As String
Dim thisWB As Workbook
Dim importWB As Workbook

Set thisWB = ThisWorkbook
Set fd = Application.FileDialog(msoFileDialogFilePicker)

With fd
   .Filters.Clear
   .Filters.Add "Excel Files", "*.xlsx?", 1
   .Title = "Choose an Import file"
   .AllowMultiSelect = False
   .InitialFileName = "C:\"

   If .Show = True Then

       strFile = .SelectedItems(1)

   End If
End With


Set importWB = Workbooks.Open(strFile)
Dim exportSheet As Worksheet
Set exportSheet = importWB.Sheets("export")

importWB.Close False

thisWB.Activate
exportSheet.Copy After:=ActiveWorkbook.Sheets(1)

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

Ответы [ 2 ]

3 голосов
/ 02 апреля 2020

Set exportSheet = importWB.Sheets("export") не создает копию листа экспорта. Создает переменную с указателем на лист. Поэтому, если вы закроете книгу с листом экспорта, ваш указатель ничего не будет ссылать.

Параметр Type метода Worksheets.Add объявляет, какой тип листа Excel нужно добавить.

Если вы хотите создать пустой лист того же типа, что и лист экспорта, вы бы сделали это так:

'...
Set exportSheet = importWB.Sheets("export")
thisWB.Worksheets.Add Before:=thisWB.Sheets("Sheet1"), Type:=exportSheet.Type
importWB.Close False

Если вы хотите скопировать лист, вы должны сделать это так:

'...
importWB.Sheets("export").Copy Before:=thisWB.Sheets("Sheet1")
importWB.Close False
0 голосов
/ 02 апреля 2020

Вы должны оставить свой importWB открытым во время экспорта. Закройте его после того, как это будет сделано.

Вы сможете экспортировать лист с этим кодом:

exportSheet.Copy Before:=ThisWorkbook.Sheets(1)
importWB.Close False

Это скопирует exportSheet перед первым листом, но вы можете адаптировать его к ваши потребности.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...