我正在尝试使用多个错误语句来解决问题。
如果可以在本地找到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
放在那里,但没有它就无法工作。
答案 0 :(得分:2)
使用多个On Error Goto XYZ
处理程序来控制流程会使一些简单的验证检查过于复杂,然后只需使用错误处理来解决实际错误。
正如@Rory在评论中指出的那样,您可以使用Dir
函数。您可以将Dir
与If...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
程序之前,通过验证文件是否存在来清理控制流。
最好的错误处理策略是首先避免引发运行时错误。