Хранить копии листа в переменном рабочем листе

Обновить

November 2018

Просмотры

1.1k раз

2

То, что я хочу добиться:

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

То, что я пытался и результаты

Во- первых: Код ниже работает отлично. Нечто подобное я хотел бы достичь, но при использовании worksheet.copy.

Sub DuplicateSheetRenameFirst()
    Dim wsDuplicate As Worksheet
    Set wsDuplicate = Worksheets.Add
    wsDuplicate.Name = "Duplicate"
End Sub

Во- вторых: Используя метод копирования, создает таблицу в текущей рабочей книге, но генерирует ошибку времени выполнения 424 - требуемый объект .

Sub DuplicateSheetRenameSecond()

    Dim wsDuplicate As Worksheet
    Set wsDuplicate = Worksheets("Sheet1").Copy(after:=Worksheets(Worksheets.Count))
    'above line : runtime error 424 object required, but the sheet is created
    wsDuplicate.Name = "Duplicate"

End Sub

Третий: Создает лист в новой книге (так создает книгу, а затем лист), но по- прежнему создает тот же Ошибка выполнения 424 - Требуются объект .

Sub DuplicateSheetRenameThird()

    Dim wsDuplicate As Worksheet
    Set wsDuplicate = Worksheets("Sheet1").Copy
    'above line : runtime error 424 object required, but the sheet is created in new workbook
    wsDuplicate.Name = "Duplicate"

End Sub

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


Вопрос:

Есть простой (один шаг) способ сохранить копию листа в переменной? Предпочтительно без ошибок или без фильтрации ошибки с обработчиком ошибок.

1 ответы

2

Это может быть хорошо?

Sub copySheet()

Dim ws As Excel.Worksheet
Excel.ThisWorkbook.Sheets("Sheet1").Copy After:=Sheets(1)
Set ws = Excel.ThisWorkbook.ActiveSheet

End Sub

К сожалению, в этом случае вы должны использовать Active...объект. Как правило , это хорошая практика , чтобы избежать Active...объектов.

Вы не можете сделать это , хотя , как метод .copyне возвращает объект класса рабочего листа:

Sub copySheet()

Dim ws As Excel.Worksheet
Set ws = Excel.ThisWorkbook.Sheets("Sheet1").Copy(After:=Sheets(1))

End Sub

Некоторые дальнейшие объяснения в этом предыдущем посте:
Почему Worksheet.Copy не возвращает ссылку на новую книгу , созданной

В MSDNэто не совсем очевидно , что метод ничего не возвращает:
https://msdn.microsoft.com/EN-US/library/office/ff837784.aspx

... но в вашем другом в Excel Object Explorer, это более очевидно. Если он возвращал объект рабочего листа затем стрелка в следующей редакции:

Sub Copy ([До] [После]) в качестве рабочего листа

введите описание изображения здесь