我正在尝试复制给定的图纸并将其重命名为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。
也就是说,为什么第二次未处理该错误?
答案 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
是否返回TRUE
或FALSE
。在FALSE
上,您可以命名工作表。
根据@Peh他的评论,您可能需要一种方法来首先检查ParamsToBeCloned
和x
是否是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