【问题标题】:Skip code if no error occurs by using an "if statement" in VBA如果在 VBA 中使用“if 语句”没有发生错误,则跳过代码
【发布时间】:2016-11-21 20:30:46
【问题描述】:

我需要一些输入,因为我对 VBA 很陌生。

我有一部分代码正在三个不同的路径位置寻找文件。代码尝试路径1,如果出错,会继续下一条路径(完美)

我的问题是,如果文件路径适用于代码“test 2”和“test 3”,它将始终运行到最后一个(即“test 3”),而不是跳转到下一部分代码。如果位置路径适用于例如测试 1 或测试 2 位置,我不需要在之后运行以下行。 如何让我的代码跳过那部分?

'Test 1 location path
   On Error GoTo Err1:
     sFldr = "Path1"
Err1:
     Resume Next

'Test 2 location path
     On Error GoTo Err2:
     sFldr = "Path2"
Err2:
     Resume Next

'Test 3 location path
   On Error GoTo Err3:
     sFldr = "Path3"
Err3:
     Resume Next

'next part of big code
more code here

【问题讨论】:

    标签: vba excel error-handling skip


    【解决方案1】:

    如果我理解正确,您需要逐步尝试(在这个人为的示例中)sFldr 的值,并且操作可能会出错。不用On Error Goto,直接测试Err对象是否有错误:

    On Error Resume Next
    sFldr = "Path1"
    If Err.Number <> 0 Then
        Err.Clear
        sFldr = "Path2"
        If Err.Number <> 0 Then
            Err.Clear
            sFldr = "Path3"
        End If
    End If
    On Error GoTo 0 'Or resume your normal error handling.
    'next part of big code
    

    这样称呼它:

    If GetFldrValue = vbNullString Then
        'whatever you need to do if all 3 fail.
    End If
    'next part of big code
    

    另一种选择是将整个事情提取到它自己的函数中(这可能不是一个坏主意 - 注释“大代码的下一部分”表明例程可能做的太多了)。如果这样做,您可以完全关闭错误处理并返回找到的第一个有效值:

    Function GetFolderValue() As String
        On Error Resume Next
        GetFolderValue = "Path1"
        If Err.Number <> 0 Then Exit Function
        GetFolderValue = "Path2"
        If Err.Number <> 0 Then Exit Function
        GetFolderValue = "Path3"
    End Function
    

    【讨论】:

    • 是的,你完全正确。第一部分解决了我面临的问题。它工作得很好。非常感谢您的宝贵意见和反馈。非常感谢!
    【解决方案2】:

    一个过程 = 一个错误处理程序。

    就这么简单。

    确保错误处理子例程只在错误状态下运行

    我真的不能给你一个比这更具体的答案,因为你向我们展示的代码实际上什么也没做;将字符串文字分配给字符串变量永远不会引发错误,......并且在“正常”执行路径中从一行上下跳转到另一行的工作流不是理智 - 你需要重组的东西。我很乐意提供帮助,但我不知道你的代码是做什么的。

    简而言之,您应该有如下所示的小程序:

    Private Sub DoSomething()
        On Error GoTo CleanFail
    
        'procedure code here
    
    CleanExit:
        'cleanup code here
        Exit Sub
    
    CleanFail:
        'error-handling code here
        Resume CleanExit
    End Sub
    

    【讨论】:

    • 非常感谢您的努力。我试图阅读和理解,但在理解这个级别的错误处理之前还有很长的路要走。但我尝试学习,这对于为我增加更多输入非常有价值。谢谢!
    【解决方案3】:

    选项 1:封装函数 最好将其包装在一个负责检索 sFldr 值的函数中。

    选项 2:GoTo 语句 - 不推荐 如果sFldr 的值不为空,则可能添加GoTo

    'Test 1 location path
       On Error GoTo Err1:
         sFldr = "Path1"
         If(sFldr <> "") Then Goto ContinueFunc
    Err1:
         Resume Next
    
    'Test 2 location path
         On Error GoTo Err2:
         sFldr = "Path2"
         If(sFldr <> "") Then Goto ContinueFunc
    

    【讨论】:

    • 谢谢,但我没有得到我想要的结果。但是,非常感谢您的时间和反馈。非常感谢。
    猜你喜欢
    • 2021-12-31
    • 1970-01-01
    • 2012-04-27
    • 2015-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多