«Ошибка выполнения 1004: сбой метода копирования класса листа» в VBA при первой попытке копирования - PullRequest
0 голосов
/ 20 июня 2019

(заранее извините за мой плохой английский: не первый язык :)) Я пишу подпрограмму VBA Excel 2003, которая запускает в файле более 50 рабочих листов, копирует рабочие листы (просто как временную копию) одну за другой, а затем выполняет действия с ними перед удалением этих временных копий и возвращает результат их вычислений содержание рабочих листов. Чтобы быть более точным: код вызывается из внешнего файла с одним (скрытым) рабочим листом внутри. Когда я открываю файл, он запускает код для создания новой панели инструментов в Excel, когда я нажимаю кнопку на панели инструментов, запускается код, который я описал выше.

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

Это код, вызывающий проблему, извините за плохое форматирование:

ActiveWorkbook.Worksheets("NAME OF THE FIRST WORKSHEET I WANT TO COPY").Copy ThisWorkbook.Worksheets("HiddenSheet")

Disclamer: имя рабочего листа определяется циклом For..Next в массиве ActiveWorkbook.Worksheets, но код не работает, даже если я сам жестко кодирую имя.

Вот более крупный фрагмент кода, который будет понятнее:

Set sourceWorkbook = ActiveWorkbook
For index = 1 To sourceWorkbook.Worksheets.Count
    sourceWorkbook.Activate 'not sure if this is even needed
    Set currWorksheet = sourceWorkbook.Worksheets(index)
    currWorksheet.Copy ThisWorkbook.Worksheets("HiddenSheet")
Next index

Результат теперь постоянно:

Ошибка времени выполнения «1004» Ошибка копирования метода класса листа.

Заранее благодарю всех за помощь!

1 Ответ

0 голосов
/ 20 июня 2019

Некоторые полезные рекомендации:

Option Explicit
'Copy sheet
Sub CopySheet()

    Dim ws1 As Workbook, ws2 As Workbook

    'It's better to declare sheets and avoid activate
    Set ws1 = Workbooks("Book1")
    Set ws2 = Workbooks("Book2")

    'Copy sheet "Test" from ws1(Book1) to ws2 (Book2) after all sheets
    ws1.Worksheets("Test").Copy After:=ws2.Worksheets(Sheets.Count)

End Sub

Option Explicit
'Copy a range
Sub CopyRange()

    Dim ws1 As Workbook, ws2 As Workbook

    'It's better to declare sheets and avoid activate
    Set ws1 = Workbooks("Book1")
    Set ws2 = Workbooks("Book2")

    'Copy from ws1(Book1), sheet "Test" & range A1:A5 to ws2 (Book2), sheet "sheet1" & range A1
    ws1.Worksheets("Test").Range("A1:A5").Copy
    ws2.Worksheets("Sheet1").Range("A1").PasteSpecial Paste:=xlPasteValues

End Sub
...