如果在VBA中使用“if语句”没有发生错误,请跳过代码

时间:2016-11-21 20:30:46

标签: vba excel-vba error-handling skip excel

我需要一些输入,因为我对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

3 个答案:

答案 0 :(得分:3)

如果我理解正确,你需要逐步尝试(在这个设计的例子中)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

答案 1 :(得分: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

答案 2 :(得分:1)

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

选项2:GoTo声明 - 不推荐 如果GoTo的值不为空

,可能会添加sFldr
'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