Excel VBA多个error handling在同一个程序中

我曾经在VBA中成功地使用过error handling,但是当试图使用几个error handling块时,我无法弄清楚如何去做。

我写的代码如下所示:

... On Error GoTo ErrorHandler1 shpArrow1.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolProduct").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpArrow1.Width / 2 shpTag1.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolProduct").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpTag1.Width / 2 shpArrow2.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolUnderlyings").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpArrow2.Width / 2 shpTag2.Left = shpLine.Left + shpLine.Width * Min(Sqr(Calculations.Range("cVolUnderlyings").value / Calculations.Range("cVolRefIndices").value), 2) / 2 - shpTag2.Width / 2 shpIndexLine.Left = shpLine.Left + shpLine.Width / 2 - shpIndexLine.Width / 2 GoTo NoError1 ErrorHandler1: shpArrow1.Left = shpLine.Left - shpArrow1.Width / 2 shpTag1.Left = shpLine.Left - shpTag1.Width / 2 shpArrow2.Left = shpLine.Left - shpArrow2.Width / 2 shpTag2.Left = shpLine.Left - shpTag2.Width / 2 shpIndexLine.Left = shpLine.Left + shpLine.Width / 2 - shpIndexLine.Width / 2 errorRelativeRisk = 1 NoError1: On Error GoTo 0 On Error GoTo ErrorHandler2 Output.ChartObjects("ChartHistoryUnderlyings").Activate ActiveChart.Axes(xlValue).CrossesAt = ActiveChart.Axes(xlValue).MinimumScale ActiveChart.Axes(xlCategory).CrossesAt = ActiveChart.Axes(xlCategory).MinimumScale GoTo NoError2 ErrorHandler2: errorHistUnderl = 1 NoError2: On Error GoTo 0 ... 

第二个error handling块不起作用。 我猜测我没有正确地退出第一个error handling块。 试图find一个适合我的答案,但没有成功。

伟大的任何帮助!

在一个过程中有两个或更多的error handling子程序肯定是一种devise的气味; 这不是VBAerror handling的工作方式。

基本上你有这个:

 Sub Foo() On Error GoTo ErrHandler1 '(code) ErrHandler1: '(error handling code) On Error GoTo ErrHandler2 '(code) ErrHandler2: '(error handling code) End Sub 

当第一个块发生错误时,VBA跳转到ErrHandler1 ,当它到达第二个块时仍然认为它在error handling子程序中

你需要在某个地方Resume ,告诉VBA“我已经处理了我必须处理的一切”。

因此,而不是“通过”进入NoError1子程序,你的ErrorHandler1子程序应该以Resume跳转结束:

 Resume NoError1 

ErrorHandler2也应该以Resume跳转结束:

 Resume NoError2 

这样,VBA知道它已经脱离了“error handling模式”并回到了“正常执行”。

但我强烈build议考虑单独的方法/程序,而不是标记的子程序。

我认为你应该在每个error handling代码之后放入End Sub