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。这确保了如果我没有第二个孩子,我不必担心:)