在错误goto上excel倍数

时间:2017-03-29 14:31:44

标签: excel vba excel-vba

我正在尝试使用多个错误语句来解决问题。

如果可以在本地找到pdf然后打开,如果没有则打开网络位置。如果没有PDF,则返回msgbox。

Sub Cutsheets()
Application.ScreenUpdating = False

Dim finalrow As Integer

finalrow = Cells(Rows.Count, 1).End(xlUp).Row
On Error GoTo net1

If Not Application.Intersect(ActiveCell, Range("A9:A" & finalrow)) Is Nothing Then
    'Local Location
ActiveWorkbook.FollowHyperlink "C:\Local" & ActiveCell & ".pdf"
Application.SendKeys "{ENTER}", True
End If
Exit Sub

net1:
If Not Application.Intersect(ActiveCell, Range("A9:A" & finalrow)) Is Nothing Then
    'Network Location
On Error GoTo whoa
ActiveWorkbook.FollowHyperlink "P:\Network" & ActiveCell & ".pdf"
Application.SendKeys "{ENTER}", True
End If
Exit Sub

whoa:
MsgBox ("No cutsheet can be found for this item.")

Application.ScreenUpdating = True

End Sub

此外,我不记得为什么我将sendkeys放在那里,但没有它就无法工作。

2 个答案:

答案 0 :(得分:2)

使用多个On Error Goto XYZ处理程序来控制流程会使一些简单的验证检查过于复杂,然后只需使用错误处理来解决实际错误。

正如@Rory在评论中指出的那样,您可以使用Dir函数。您可以将DirIf...ElseIf...Else...End If构造结合使用来控制代码的作用:

Option Explicit

Sub Cutsheets()

    On Error GoTo ErrHandler

    Dim strLocalCheck As String
    Dim strNetworkCheck As String

    'check for files - Dir will return "" if file not found
    strLocalCheck = Dir("C:\Local" & ActiveCell.Value & ".pdf")
    strNetworkCheck = Dir("P:\Network" & ActiveCell.Value & ".pdf")

    'control flow
    If strLocalCheck <> "" Then
        ActiveWorkbook.FollowHyperlink strLocalCheck
        Application.SendKeys "{ENTER}", True

    ElseIf strNetworkCheck <> "" Then
        ActiveWorkbook.FollowHyperlink strNetworkCheck
        Application.SendKeys "{ENTER}", True

    Else
        MsgBox "No cutsheet can be found for this item."

    End If

    Exit Sub

ErrHandler:
    Debug.Print "A real error occurred: " & Err.Description

End Sub

答案 1 :(得分:2)

  

我正在尝试使用多个错误语句来运行

别。

想象一下你是VBA运行时。您正在执行名为Cutsheets的过程,并且您遇到了此说明:

On Error GoTo net1

从那时起,在用户脸部爆炸之前,如果遇到运行时错误,您将跳转到net1标签。所以你继续运行说明。最后你运行这一行:

ActiveWorkbook.FollowHyperlink "C:\Local" & ActiveCell & ".pdf"

FollowHyperlink方法响应“呃nope,不能这样做”并引发运行时错误时,执行上下文会发生变化。

您处于“错误处理”模式。

所以你跳转到net1标签。 您处于“错误处理”模式。在“正常执行模式”中你可以做某些事情,你不能(或不应该)在“错误处理模式”中做。提升和处理更多错误就是其中之一。

On Error GoTo whoa

已经处理运行时错误:在错误处理程序子例程中遇到该语句时应该怎么做?立即跳转到whoa

当VBA运行时处于“错误处理模式”时,作为程序员的工作是处理运行时错误并尽一切可能恢复到“正常执行模式”尽快 - 通常使用Resume指令或离开当前范围。

在“错误处理模式”中复制“正常执行路径”中的一大块代码并尝试运行它(略有改动)不是处理错误并尽快恢复到正常执行模式< / em>的

错误处理与否, copy-pasting 代码块代码编写得很差。

改为提取程序:

Private Sub OpenPortableDocumentFile(ByVal path As String)
    On Error GoTo ErrHandler
    ActiveWorkbook.FollowHyperlink path
    Application.SendKeys "{ENTER}", True
    Exit Sub
ErrHandler:
    MsgBox "Could not open file '" & path & "'."
End Sub

现在已经开始了,在将无效的path传递给OpenPortableDocumentFile程序之前,通过验证文件是否存在来清理控制流。

最好的错误处理策略是首先避免引发运行时错误。