所以我尝试使用On Error来完成以下操作。我试图从活动工作表中选择下一个工作表(试图避免使用工作表名称)。如果这会产生错误,即活动纸张后面没有纸张,则需要添加新纸张。我希望有一些简单的事情,如果......是错误然后....,但没有。
我尝试了On Error的多种变体而没有运气。即使在活动状态之后还有另一张纸,因此没有错误,它仍然会创建一个新工作表,但我只是想让它选择该工作表。它只应在选择下一个工作表时添加工作表并生成错误。有什么建议吗?
On Error GoTo AddSheet:
Worksheets(ActiveSheet.Index + 1).Select
AddSheet:
Sheets.Add After:=ActiveSheet
Resume Next
刚试过这个也没有运气:
On Error GoTo AddSheet:
Worksheets(ActiveSheet.Index + 1).Select
Resume Label1:
AddSheet:
Sheets.Add After:=ActiveSheet
Label1:
答案 0 :(得分:1)
如果遇到问题,你只需要告诉你程序离开子程序。您还希望Resume
而不是Resume Next
重试导致错误的行,在这种情况下,我认为您会这样做。
On Error GoTo AddSheet:
Worksheets(ActiveSheet.Index + 1).Select
Exit Sub 'or Exit Function if you are in a function
AddSheet:
Sheets.Add After:=ActiveSheet
Resume
注意实际应用时:
Sub Foo()
' Some Code
On Error GoTo AddSheet:
Worksheets(ActiveSheet.Index + 1).Select
On Error GoTo 0 'This turns off the error handling in case after it is no longer needed
' the rest of your code
Exit Sub
AddSheet:
Sheets.Add After:=ActiveSheet
Resume
End Sub
答案 1 :(得分:1)
您的问题是Resume Label1:
将其更改为Goto Label1:
附录:我不知道为什么要使用Goto代替Resume,所以我做了一些实验。
在以下代码中,Resume有效地忽略了提供的标记,因为Resume旨在进入错误处理程序。由于没有发生任何错误,因此任何对Resume的调用都会将代码推送到On Error GoTo <Label>
中定义的Label,即使您只是在没有Label的情况下调用Resume
。
Sub ErrorHandlingPlay()
On Error GoTo AddSheet
Resume Label1: 'Resume moves flow to AddSheet instead
Label1:
Exit Sub
AddSheet:
Debug.Print "This gets printed."
End Sub
但是如果你把Resume放在你的错误处理标签里面,它就会成功地移动流程:
Sub ErrorHandlingPlay()
On Error GoTo AddSheet:
Debug.Print 1 / 0 'To throw an error
Label1:
Exit Sub
AddSheet:
Resume Label1: 'Flow successfully moves to Label1 after the error is caught.
Debug.Print "This is not printed"
End Sub
基本上......如果您在错误处理标签中使用它,请使用Resume
。否则使用Goto
。