如果在 VBA 中使用 "if statement" 没有发生错误,则跳过代码

Skip code if no error occurs by using an "if statement" in VBA

我需要一些意见,因为我是 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

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

选项 2:GoTo 语句 - 不推荐 如果 sFldr 的值不为 null

,或许可以添加一个 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

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

就这么简单。

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

我真的不能给你比这更具体的答案了,因为你给我们看的代码实际上什么也没做;将字符串文字分配给字符串变量永远不会引发错误,...以及在 "normal" 执行路径 中从一行跳到另一行的工作流 不正常 - 你需要重组事物。我很乐意提供帮助,但我不知道您的代码是做什么的。

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

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

如果我理解正确,您需要逐步尝试(在这个人为的示例中)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

另一个选择是将整个事情提取到它自己的函数中(这可能不是一个坏主意 - 评论 "next part of big code" 表明例程可能做得太多)。如果这样做,您可以完全关闭错误处理并 return 找到第一个有效值:

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