Скопировать лист и получить получившийся объект листа? - PullRequest
25 голосов
/ 07 октября 2011

Есть ли простой / короткий способ получить объект Excel.worksheet для нового листа, который вы получаете при копировании листа?

ActiveWorkbook.Sheets("Sheet1").Copy after:=someSheet

Оказывается, метод .Copy возвращает логическое значение вместо объекта рабочего листа.В противном случае я мог бы сделать:

set newSheet = ActiveWorkbook.Sheets("Sheet1").Copy after:=someSheet    <-- doesn't work

Итак, я написал около 25 строк кода для получения объекта (перечислите все листы до копирования, перечислите все листы после и выясните, какой из них находится втолько последний список. Все очень длинные в VBA), но я ищу более элегантное, более короткое решение.

Ответы [ 11 ]

0 голосов
/ 22 декабря 2017

Я пытался создать надежную универсальную функцию-обертку для метода sheet.Copy для повторного использования в нескольких проектах в течение многих лет.

Я попробовал несколько подходов здесь, и яМы нашли только ответ Марка Мура, чтобы быть надежным решением для всех сценариев.То есть тот, который использует имя «Template (2)» для идентификации нового листа.

В моем случае любое решение, использующее «метод ActiveSheet», было бесполезным, так как в некоторых случаях целевая книга находилась вАктивная или скрытая рабочая тетрадь.

Аналогичным образом, некоторые из моих рабочих тетрадей содержат скрытые листы, смешанные с видимыми листами в различных местах;в начале, в середине, в конце;и поэтому я нашел решения, использующие опции До: и После: также ненадежные в зависимости от упорядочения видимых и скрытых листов, а также дополнительного фактора, когда исходный лист также скрыт.

Поэтому после нескольких повторных-пишет, у меня появилась следующая функция-обертка:

'***************************************************************************
'This is a wrapper for the worksheet.Copy method.
'
'Used to create a copy of the specified sheet, optionally set it's name, and return the new
' sheets object to the calling function.
'
'This routine is needed to predictably identify the new sheet that is added. This is because
' having Hidden sheets in a Workbook can produce unexpected results in the order of the sheets,
' eg when adding a hidden sheet after the last sheet, the new sheet doesn't always end up
' being the last sheet in the Worksheets collection.
'***************************************************************************
Function wsCopy(wsSource As Worksheet, wsAfter As Worksheet, Optional ByVal sNewSheetName As String) As Worksheet

    Dim Ws              As Worksheet

    wsSource.Copy After:=wsAfter
    Set Ws = wsAfter.Parent.Sheets(wsSource.Name & " (2)")

    'set ws Name if one supplied
    If sNewSheetName <> "" Then
        Ws.Name = sNewSheetName
    End If
    Set wsCopy = Ws
End Function

ПРИМЕЧАНИЕ. Даже у этого решения будут проблемы, если имя исходного листа превышает 27 символов, так как максимальное имя листа - 31,но обычно это под моим контролем.

...