Excel 如何跳过运行时错误9 vba?

Excel 如何跳过运行时错误9 vba?,excel,runtime-error,vba,Excel,Runtime Error,Vba,我制作了一个宏来打开许多文件,并在最终文件中执行复制和粘贴等操作。 但我想在没有文件时跳过与此文件相关的代码: 'create variables' FinalFile = "order.xls" Obj1 = "order-obj1.xls" Obj1Range = "E11" ...... Windows(Obj1).Activate Range(MyRange).Select Selection.Copy Windows(FinalFile).Activate Range(Obj1Ran

我制作了一个宏来打开许多文件,并在最终文件中执行复制和粘贴等操作。 但我想在没有文件时跳过与此文件相关的代码:

'create variables'
FinalFile = "order.xls" 
Obj1 = "order-obj1.xls"
Obj1Range = "E11"
......
Windows(Obj1).Activate
Range(MyRange).Select
Selection.Copy
Windows(FinalFile).Activate
Range(Obj1Range).Select
ActiveSheet.Paste
Windows(Obj1).Activate
ActiveWindow.Close

Windows(Obj2).Activate
Range(MyRange).Select
Selection.Copy
Windows(FinalFile).Activate
Range(Obj2Range).Select
ActiveSheet.Paste
Windows(Obj2).Activate
ActiveWindow.Close
如果我无法打开某些文件,我会收到运行时错误9。因此,我的问题是如何跳过Obj1的代码并继续执行Obj2? 我希望你能理解我

使用commmand Dir()检查文件是否存在

e、 g

如果Dir(Obj1)“,则
Windows(Obj1)。激活
范围(MyRange)。选择
选择,复制
Windows(最终文件)。激活
范围(Obj1Range)。选择
活动表。粘贴
Windows(Obj1)。激活
活动窗口,关闭
如果结束
另外,您可能希望将此代码放入函数中以避免重复,但这是另一个问题。

使用commmand Dir()检查文件是否存在

e、 g

如果Dir(Obj1)“,则
Windows(Obj1)。激活
范围(MyRange)。选择
选择,复制
Windows(最终文件)。激活
范围(Obj1Range)。选择
活动表。粘贴
Windows(Obj1)。激活
活动窗口,关闭
如果结束

此外,您可能希望将此代码放入函数中,以免重复,但这是另一个问题。

未经测试。

我会这样做的。不使用
。选择/。激活

Dim destwb As Workbook

Sub Sample()
    Dim FinalFile As String
    Dim Obj1 As String, Obj2 As String
    Dim MyRange As String, Obj1Range As String, Obj1Rang2 As String
    Dim wb As Workbook

    '~~> Change as applicable
    FinalFile = "order.xls"
    Obj1 = "order-obj1.xls"
    Obj2 = "order-obj2.xls"
    Obj1Range = "E11"
    Obj2Range = "E12"
    MyRange = "A1"

    Set destwb = Workbooks(FinalFile)

    On Error Resume Next
    Set wb = Workbooks(Obj1)
    On Error GoTo 0

    If Not wb Is Nothing Then
        CopyRange wb, MyRange, Obj1Range
        DoEvents
        Set wb = Nothing
    End If

    On Error Resume Next
    Set wb = Workbooks(Obj2)
    On Error GoTo 0

    If Not wb Is Nothing Then
        CopyRange wb, MyRange, Obj2Range
        DoEvents
        Set wb = Nothing
    End If
End Sub

Sub CopyRange(w As Workbook, r1 As String, r2 As String)
    On Error GoTo Whoa

    Dim ws As Worksheet, rng As Range

    Set ws = w.Sheets(1)
    Set rng = ws.Range(r1)

    r1.Copy destwb.Sheets("Sheet1").Range(r2)

    DoEvents

    wb.Close savechanges:=False

    Exit Sub
Whoa:
    MsgBox Err.Description
End Sub

未经测试

我会这样做的。不使用
。选择/。激活

Dim destwb As Workbook

Sub Sample()
    Dim FinalFile As String
    Dim Obj1 As String, Obj2 As String
    Dim MyRange As String, Obj1Range As String, Obj1Rang2 As String
    Dim wb As Workbook

    '~~> Change as applicable
    FinalFile = "order.xls"
    Obj1 = "order-obj1.xls"
    Obj2 = "order-obj2.xls"
    Obj1Range = "E11"
    Obj2Range = "E12"
    MyRange = "A1"

    Set destwb = Workbooks(FinalFile)

    On Error Resume Next
    Set wb = Workbooks(Obj1)
    On Error GoTo 0

    If Not wb Is Nothing Then
        CopyRange wb, MyRange, Obj1Range
        DoEvents
        Set wb = Nothing
    End If

    On Error Resume Next
    Set wb = Workbooks(Obj2)
    On Error GoTo 0

    If Not wb Is Nothing Then
        CopyRange wb, MyRange, Obj2Range
        DoEvents
        Set wb = Nothing
    End If
End Sub

Sub CopyRange(w As Workbook, r1 As String, r2 As String)
    On Error GoTo Whoa

    Dim ws As Worksheet, rng As Range

    Set ws = w.Sheets(1)
    Set rng = ws.Range(r1)

    r1.Copy destwb.Sheets("Sheet1").Range(r2)

    DoEvents

    wb.Close savechanges:=False

    Exit Sub
Whoa:
    MsgBox Err.Description
End Sub


一般来说,建议在错误恢复时使用
。不要使用OERN,除非你非常喜欢应用程序中的惊喜。我会争论这是否是一个坏建议@PradeepKumar。这要视情况而定。。。当我看到代码使用.Select.Activate等时,我认为帮助某人的最简单方法是根据他们对编程语言(或者更确切地说是录制的宏)的理解程度调整解决方案。无论讨论主题包含什么内容,我都不会建议向任何人提供一个糟糕(但有效)的解决方案,而不向他们解释实施该解决方案所面临的风险。解决特定问题的定制解决方案是可以接受的,但像使用OERN等一样常见的东西,我永远不会推荐。如果您能解释一下,如果他们在应用程序中遇到的下一个运行时错误都使用OERN,他们会如何搞乱程序,这会更好。@PradeepKumar根据我how的评论,OERN是一种合理的方法,这取决于情况和您测试的对象(例如是否存在工作表)。哇!关于欧恩的问题稍后才来。首先是一个人是否应该使用这种方法!请避免使用
。选择/。激活
!!!然后可以使用OERN检查工作表/工作簿是否存在。但是,将OERN与OEGT0一起使用。建议在下一次错误恢复时使用
通常是一个不好的建议。不要使用OERN,除非你非常喜欢应用程序中的惊喜。我会争论这是否是一个坏建议@PradeepKumar。这要视情况而定。。。当我看到代码使用.Select.Activate等时,我认为帮助某人的最简单方法是根据他们对编程语言(或者更确切地说是录制的宏)的理解程度调整解决方案。无论讨论主题包含什么内容,我都不会建议向任何人提供一个糟糕(但有效)的解决方案,而不向他们解释实施该解决方案所面临的风险。解决特定问题的定制解决方案是可以接受的,但像使用OERN等一样常见的东西,我永远不会推荐。如果您能解释一下,如果他们在应用程序中遇到的下一个运行时错误都使用OERN,他们会如何搞乱程序,这会更好。@PradeepKumar根据我how的评论,OERN是一种合理的方法,这取决于情况和您测试的对象(例如是否存在工作表)。哇!关于欧恩的问题稍后才来。首先是一个人是否应该使用这种方法!请避免使用
。选择/。激活
!!!然后可以使用OERN检查工作表/工作簿是否存在。但是,在OEGT0中使用OERN。这是一个很好的前瞻性方法,而不是在错误中运行。谢谢你的建议。但是当我用你的代码启动它时,我收到了运行时错误13。类型不匹配…“我发现它..它应该是
If Dir(Obj1)”,然后
以这种方式我忽略了新的错误。Thx是一种“向前看而不是在错误中运行的好方法。谢谢你的建议..但是当我用你的代码启动它时,我收到了运行时错误13。类型不匹配…“我发现了。它应该是
If Dir(Obj1)”,然后以这种方式我忽略了新的错误。Thx很多“+1,出于好奇,还有一个问题:我们需要在第一个OERN部分之后清除错误吗?还是第二个孩子,明白了吗?(我会自己检查,但我现在不能)@loannis:是的,第二个OERN将清除它,但默认情况下,我确保我包括OEGT0。这确保了如果我没有第二个OERN,我不必担心:)+1和一个出于好奇的问题:我们需要在第一个OERN部分之后清除错误吗?还是第二个孩子,明白了吗?(我会自己检查,但我现在不能)@loannis:是的,第二个OERN将清除它,但默认情况下,我确保我包括OEGT0。这确保了如果我没有第二个孩子,我不必担心:)