Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba excel多次出错转到_Vba_Excel - Fatal编程技术网

Vba excel多次出错转到

Vba excel多次出错转到,vba,excel,Vba,Excel,我试图让多个on-error语句正常工作,但无法解决这个问题 如果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.Inters

我试图让多个on-error语句正常工作,但无法解决这个问题

如果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
放在那里,但是没有它它就不能工作。

在错误上使用多个
处理程序转到XYZ
控制流会使一些简单的验证检查复杂化,然后只需对实际错误使用错误处理

正如@Rory在评论中指出的,您可以使用该函数。您可以将
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
选项显式
子切纸()
关于错误转到错误处理程序
Dim strLocalCheck As字符串
Dim strNetworkCheck作为字符串
'检查文件-如果找不到文件,目录将返回“”
strLocalCheck=Dir(“C:\Local”和ActiveCell.Value&“.pdf”)
strNetworkCheck=Dir(“P:\Network”和ActiveCell.Value&“.pdf”)
“控制流
如果选中“”,则
ActiveWorkbook.FollowHyperlink strLocalCheck
Application.SendKeys“{ENTER}”,True
否则,请检查“”然后重试
ActiveWorkbook.FollowHyperlink strNetworkCheck
Application.SendKeys“{ENTER}”,True
其他的
MsgBox“找不到此项目的剪切表。”
如果结束
出口接头
错误处理程序:
Debug.Print“发生实际错误:”&Err.Description
端接头
我正在尝试让多个on错误语句正常工作

不要

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

On Error GoTo net1
从那时起,在你对着用户脸发火之前,如果你遇到运行时错误,你将跳转到
net1
标签。所以你继续运行指令。最终您运行以下行:

ActiveWorkbook.FollowHyperlink "C:\Local" & ActiveCell & ".pdf"
FollowHyperlink
方法响应“呃,不,不能那样做”并引发运行时错误时,您的执行上下文将发生更改

您处于“错误处理”模式

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

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

当VBA运行时处于“错误处理模式”时,作为程序员,您的工作是处理运行时错误,并尽一切可能尽快回到“正常执行模式”——这通常通过
恢复
指令或离开当前作用域来完成

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

不管是否处理错误,复制粘贴代码块都是写得很差的代码

而是提取一个过程:

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
现在已经解决了这个问题,在将无效的
路径
传递到
OpenPortableDocumentFile
过程之前,通过验证文件是否存在来清理控制流


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

如果没有Resume语句、代码结束或错误转到-1时
,则无法清除异常。请参阅:您可以使用
Dir
检查文件是否存在。@Robin如果它找不到任何东西,则会弹出
MsgBox
,但当它应该找到PDF时,它什么也不做。除了您正在做的一些检查之外,我基本上遵循了您的逻辑。。。什么不起作用?@Robin没有打开超链接。知道为什么吗?@MattTaylor为什么不使用
Shell
命令来打开PDF,而不是使用
FollowHyperlink
SendKeys
?不-抱歉-只是从您的代码中复制了这一部分。我只是想向您展示一种更好的方法来执行控制流并避免出现多个On错误语句。嗯