【发布时间】:2019-10-13 05:01:09
【问题描述】:
我有多个程序,如下所示。代码本身是功能性的,并且做了它应该做的事情,但是现在我有一个关于错误处理的问题和一个问题:
- 如何使用
On Error GoTo 0:
导致我遇到麻烦的错误发生在mySlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile 行中。据我了解,On Error GoTo 0 将错误处理重置为 VBA 中的默认行为,这意味着我应该以正常的 VBA 方式显示错误。所以我在这里使用了两次:一次直接在我粘贴我复制的内容的行之后,一次直接在调用ErrorHandler1(和2)之后。这有意义吗?我的理由是,对于On Error GoTo ErrorHandler1,我只想捕获错误-2147188160,而在其余代码中我想要正常的VBA错误消息。那里不太可能发生错误,因为没有很多代码,但仍然存在。
Sub SubSlide1(wsKAP As Worksheet)
Set mySlide = myPresentation.Slides(1)
RepeatOnError1:
Set rng = wsKAP.Range("AC2:AN29")
rng.Copy
DoEvents
On Error GoTo ErrorHandler1
mySlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile
On Error GoTo 0
Set myShape = mySlide.Shapes(mySlide.Shapes.Count)
With myShape
.Left = 20
.Top = 48
.Width = 623
End With
RepeatOnError2:
wsKAP.Columns("K:M").EntireColumn.Hidden = False
On Error GoTo 0
Set rng = wsKAP.Range("A187:V199")
rng.Copy
DoEvents
On Error GoTo ErrorHandler2
mySlide.Shapes.PasteSpecial DataType:=ppPasteEnhancedMetafile
Set myShape = mySlide.Shapes(mySlide.Shapes.Count)
With myShape
.Left = 20
.Top = 363
.Width = 663
End With
wsKAP.Columns("K:M").EntireColumn.Hidden = True
Application.CutCopyMode = False
Exit Sub
ErrorHandler1:
On Error GoTo 0
If Err.Number = -2147188160 Then
Call ErrorHandling(1)
Else
MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
End If
Resume RepeatOnError1
ErrorHandler2:
On Error GoTo 0
If Err.Number = -2147188160 Then
Call ErrorHandling(2)
Else
MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
End If
Resume RepeatOnError2
End Sub
Sub ErrorHandling(Number As Long)
If ErrorCount(Number) > 10 Then
MsgBox "Too many errors (-2147188160) in ErrorCount(" & Number & "). Canceling."
End
End If
ErrorCount(Number) = ErrorCount(Number) + 1
Debug.Print "ErrorCount" & Number & " is " & ErrorCount(Number)
End Sub
- 有时当我运行我的代码时会弹出一个 MsgBox:“错误:0。程序将继续。” (这发生在您在此处看到的过程以及在结构上相同的其他过程中)。这意味着
ErrorHandler1中的 else 语句被触发。我使用else的目的是让我知道GoTo ErrorHandler1中出现的任何错误,但不是-2147188160。据我所知,“错误 0”意味着没有错误,那么 VBA 是如何出现的呢?
编辑:我现在重新排列并添加了End。我移动了Resume 语句,因为否则我可能会出现无限错误循环。
ErrorHandler1:
If Err.Number = -2147188160 Then
Call ErrorHandling(1)
Resume RepeatOnError1
Else
MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
End
End If
On Error GoTo 0
ErrorHandler2:
If Err.Number = -2147188160 Then
Call ErrorHandling(2)
Resume RepeatOnError2
Else
MsgBox "Fehler: " & Err.Number & ": " & Err.Description & vbNewLine & "Makro wird weiter ausgeführt."
End
End If
On Error GoTo 0
End Sub
【问题讨论】:
-
虽然下面的答案确实解释了为什么您的
Err.Number检查在On Error GoTo 0之后完成时不起作用,但我强烈建议您将代码分解为更小、更专业的程序更少的事情,理想情况下,有一个理由失败。这些GoTo和Resume跳转让事情变得难以跟踪——而且执行从RepeatOnError1下降到RepeatOnError2,这是故意的吗? -
@Mathieu Guindon 你的意思是什么?当 #1 失败时,它应该重复。成功后,它应该继续
RepeatOnError2下的内容。你是这个意思吗?至于使用更专业的潜艇:您建议将其一分为二吗?关于GoTo和Resume引起的混乱:我同意,但我没有想出替代方法。 -
我的意思是易于遵循的结构良好的代码通常只有一个错误处理程序,如果有的话。错误处理程序子程序只应在执行处于错误状态时运行,即“快乐路径”和“错误路径”之间存在清晰的分离,而在 Error1 清除错误并陷入 Error2 时不会发生这种情况。跨度>
-
@MathieuGuindon 所以假设
RepeatOnError2下的整个部分都不存在(ErrorHandler1除外):我的代码可以吗?
标签: excel vba error-handling