2016-11-21 369 views
-1

我需要一些输入,因为我对VBA很陌生。如果在VBA中使用“if语句”没有发生错误,则跳过代码

我有一个代码在三个不同的路径位置寻找文件的一部分。代码尝试路径1,如果错误,它将继续到下一个路径(这是完美的)

我的问题是,如果文件路径工作代码“测试2”和“测试3”,它将始终运行直到最后一个(即“测试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 

回答

2

如果我理解正确的话,你需要逐步尝试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 
+0

是的,你完全正确。第一部分解决了我面临的问题。它运行良好。 非常感谢您的宝贵意见和反馈。非常感激! – Wiz

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 
+0

谢谢,但我没有得到我想要的结果。但是,非常感谢您的时间和反馈。非常感激。 – Wiz

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 
+0

非常感谢您的努力。我试图阅读和理解,但在我能够理解这个级别的错误处理之前还有很长的路要走。但我尝试学习,这对于向我添加更多输入非常有价值。谢谢! – Wiz