GoTo或其他的简单错误处理

时间:2017-12-15 17:51:11

标签: excel vba excel-vba

我试图创建一个允许用户点击按钮的宏,并且Excel工作表将是1:移动到下一张/上一张或2:复制现有工作表然后移动到复制的工作表。

目前我处理错误处理情况并且不确定如何绕过它。我不确定我是否正确使用了On Error。如果一个页面不存在,我基本上需要它去我的下一个子。如果页面确实存在,只需要ActiveSheet.Index + 1,然后选择。

Sub Function1()
     On Error GoTo fixer
     Sheets(ActiveSheet.Index + 1).Select
fixer:
     Call Copier2
End Sub

Sub Copier2()
    ActiveWorkbook.ActiveSheet.Copy _
       After:=ActiveWorkbook.ActiveSheet
End Sub

非常感谢任何帮助,我对这些东西都是一个新手,所以不要害怕为我愚蠢。

1 个答案:

答案 0 :(得分:0)

让我们对此有一些乐趣,以说明机制。

首先让我们提取一个方法,其工作是激活给定的工作表。该方法将返回一个Boolean值,指示它是否成功。因为我们想要返回值,所以这将是Function过程:

Private Function ActivateSheet(ByVal index As Long) As Boolean
    Dim result As Boolean
    On Error GoTo CleanFail
    ActiveWorkbook.Sheets(index).Select
    result = True
CleanExit:
    ActivateSheet = result
    Exit Function
CleanFail:
    Err.Clear
    result = False
    Resume CleanExit
End Function

“快乐路径”将result分配给True,然后将函数的返回值分配给result,然后返回。

“错误路径”跳转到CleanFail,这会清除错误(可能某些索引超出范围错误),将result分配给False并且然后Resume CleanExit清除错误处理状态,恢复CleanExit,它将函数的返回值赋给result,然后返回。

宏现在可以这样做了:

Public Sub NavigateRight()
    If Not ActivateSheet(ActiveSheet.Index + 1) Then
    'copy the current sheet if there's no next sheet:
        ActiveSheet.Copy After:=ActiveSheet
    End If
End Sub

我们也可以有这个:

Public Sub NavigateLeft()
    If Not ActivateSheet(ActiveSheet.Index - 1) Then
    'copy the current sheet if there's no previous sheet:
        ActiveSheet.Copy Before:=ActiveSheet
    End If
End Sub

不要仅仅为了制作程序而制作程序:将它们用于抽象概念:像Copier2这样的程序实际上不需要存在,它只是包装一个调用Excel对象模型 - 最好将其内联到IMO。