Я пытаюсь скопировать данный лист и переименовать этот экземпляр sheet2, но если sheet2 существует, переименуйте его в sheet3, а если sheet3 существует, переименуйте его в sheet4 и т. Д.

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

Sub Clone()

    Application.ScreenUpdating = False

    Dim ParamsToBeCloned As String
    Dim wsNumber As Long
    Dim suffix As Long

    ParamsToBeCloned = Sheets("Interface").Range("ParamsToBeCloned")

    wsNumber = Sheets(ParamsToBeCloned).index
    Sheets(ParamsToBeCloned).Copy after:=Sheets(wsNumber)

    suffix = 2
    Do While True
        On Error GoTo sheetExists
        ActiveSheet.Name = ParamsToBeCloned & suffix
        Exit Do
sheetExists:
        suffix = suffix + 1
    Loop

    Sheets("Interface").Select

    Application.ScreenUpdating = True

End Sub

Это работает, когда существует Params2 для создания Params3, но если существуют и Params2, и Params3, выдается ошибка

«Это имя уже занято. Попробуйте другое».

Я не понимаю, почему он может генерировать Params3, когда существует Params2, но он не может генерировать Params4, когда существуют и Params2, и Params3.

То есть, почему ошибка не обрабатывается во второй раз?

0
brb 12 Сен 2019 в 09:44

2 ответа

Лучший ответ

Вы должны очистить ошибку, чтобы вызвать другую, я думаю. Попробуйте добавить On Error Goto 0 после suffix = suffix + 1. Это также может помочь Обработка ошибок VBA - полное руководство

Также обратите внимание, что этот цикл будет выполняться вечно, если активный лист нельзя переименовать. Это может произойти, например, если ParamsToBeCloned содержит недопустимые символы или если оно длиннее 32 символов (ограничение Excel для имен листов). Поэтому вы можете захотеть изменить его в цикл For, который имеет максимум, например, 1000.

For suffix = 2 To 1000
    On Error Resume Next
    ActiveSheet.Name = ParamsToBeCloned & suffix
    If Err.Number = 0 Then 'no error so successfully renamed
        On Error GoTo 0
        Exit For
    End If
    On Error GoTo 0
    If suffix = 1000 Then MsgBox "Maximum reached could not rename sheet"
Next suffix
1
Pᴇʜ 12 Сен 2019 в 06:56

Просто альтернатива использованию On Error:

For x = 2 To 1000
    If Application.Evaluate("ISREF(" & ParamsToBeCloned & x & "!A1)") = False Then
        ActiveSheet.Name = ParamsToBeCloned & x
        Exit For
    End If
Next x

Чтобы проверить, существует ли лист, мы можем попытаться проверить, возвращает ли ISREF TRUE или FALSE. На FALSE вы можете назвать свой рабочий лист.


Согласно @Peh его комментарию, вам может понадобиться способ проверить, является ли ParamsToBeCloned & x сначала действительное имя рабочего листа.

2
JvdV 12 Сен 2019 в 07:31