Я пытался создать надежную универсальную функцию-обертку для метода 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,но обычно это под моим контролем.