【问题标题】:excel multiple on error gotoexcel多次出错goto
【发布时间】:2017-03-29 14:31:43
【问题描述】:

我试图让多个错误语句起作用,但无法弄清楚。

如果可以在本地找到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放在那里但是没有它就不行。

【问题讨论】:

标签: vba excel


【解决方案1】:

为控制流使用多个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

【讨论】:

  • @Robin MsgBox 如果找不到任何东西就会弹出,但是当它应该找到 PDF 时它什么也不做。
  • 我几乎遵循了你的逻辑,除了你正在做的一些检查......什么不起作用?
  • @Robin 没有打开超链接。知道为什么吗?
  • @MattTaylor 为什么不使用Shell 命令打开PDF,而不是使用FollowHyperlinkSendKeys 破解它?
  • 不——抱歉——只是从你的代码中复制了那一点。我只是想向您展示一种更好的方法来执行控制流并避免多个 On Error 语句。 HTH
【解决方案2】:

我正在尝试让多个错误语句起作用

不要。

假设您是 VBA 运行时。您正在执行一个名为 Cutsheets 的过程,并且遇到了以下指令:

On Error GoTo net1

从那时起,在你当着用户的面炸毁之前,如果遇到运行时错误,你将跳转到net1 标签。所以你继续运行指令。最终你运行这一行:

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

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

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

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

On Error GoTo whoa

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

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

从“正常执行路径”复制一段代码并尝试在“错误处理模式”下运行(稍作改动)并不是处理错误并尽快返回正常执行模式。

不管有没有错误处理,复制粘贴块代码无论如何都是写得很糟糕的代码。

改为提取过程:

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 过程之前验证文件是否存在来清理控制流。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多