首页 > 解决方案 > 为什么错误处理程序不处理第二个错误?

问题描述

我正在尝试复制给定的工作表并重命名该副本 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 都存在,则会引发错误

“这个名字已经被占用了。换一个试试。”

我不明白为什么当 Params2 存在时它能够产生 Params3,但是当 Params2 和 Params3 都存在时它不能产生 Params4。

也就是说,为什么第二次没有处理错误?

标签: excelvbaerror-handling

解决方案


只是使用的替代方法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返回 aTRUEFALSE。在 上FALSE,您可以命名您的工作表。


根据@Peh 他的评论,您可能需要一种方法来首先检查ParamsToBeCloned&x是否是有效的工作表名称。


推荐阅读