为什么错误处理程序不能处理第二个错误?

时间:2019-09-12 06:44:28

标签: excel vba error-handling

我正在尝试复制给定的图纸并将其重命名为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。

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

2 个答案:

答案 0 :(得分:2)

只是使用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是否返回TRUEFALSE。在FALSE上,您可以命名工作表。


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

答案 1 :(得分:1)

您需要清除错误以触发另一个我认为的错误。尝试在On Error Goto 0之后添加suffix = suffix + 1。这可能也有帮助VBA Error Handling – A Complete Guide

还请注意,如果无法重命名活动工作表,则此循环将永远运行。例如,如果ParamsToBeCloned包含不允许的字符或长度超过32个字符(Excel对工作表名称的限制),则可能会发生这种情况。因此,您可能需要将其更改为一个最大为例如1000的For循环。

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