В Excel2016 эту проблему невозможно создать заново, поскольку Excel автоматически добавляет «(1)», «(2)» ... к имени листа, имя которого совпадает с именем скопированного листа.
Если вы используете более старую версию Excel, решение этой проблемы потребует воссоздания этого поведения.
Чтобы переименовать лист, я ссылаюсь на этот ответ: Переименование листа Excel с помощью if sheetимя уже существует
Создайте новую функцию для проверки имен листов в обеих книгах:
Private Function VerifySheetName(ByVal sourceWorkbook As Workbook, ByVal targetWorkbook As Workbook, ByVal sheetName As String) As String
Dim combinedSheets As New Collection
Dim tempSheet As Worksheet
For Each tempSheet In sourceWorkbook.Sheets
combinedSheets.Add tempSheet
Next tempSheet
For Each tempSheet In targetWorkbook.Sheets
combinedSheets.Add tempSheet
Next tempSheet
For Each tempSheet In combinedSheets
If tempSheet.Name = sheetName Then
VerifySheetName = sheetName & "_" & combinedSheets.Count
End If
Next tempSheet
End Function
Вызовите эту функцию в цикле:
For Each wksCurSheet In wbkSrcBook.Sheets
tempSheetName = VerifySheetName(wbkSrcBook, wbkCurBook, wksCurSheet.Name)
If Not wksCurSheet.Name = tempSheetName Then
wksCurSheet.Name = tempSheetName
End If
countSheets = countSheets + 1
wksCurSheet.Copy after:=wbkCurBook.Sheets(wbkCurBook.Sheets.Count)
Next
Ине забудьте добавить новое объявление переменной, если вы используете Option Explicit
(вам следует!)
Dim tempSheetName As String
PS При инициализации нескольких переменных в одной строке, если вы опускаете тип переменной, по умолчаниюон приведен как вариант:
Dim countFiles, countSheets As Integer
В этом случае countFiles имеет вариантный тип, а countSheets имеет целочисленный тип.Если вам нужен явный тип переменной, вам нужно назначить тип каждой переменной:
Dim countFiles as Integer, countSheets As Integer