VBA On Error AddSheet

时间:2014-07-25 18:00:48

标签: excel vba excel-vba

所以我尝试使用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:

2 个答案:

答案 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

更多信息:http://www.cpearson.com/excel/errorhandling.htm

答案 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