excel 错误,Raise只能在模块中工作,而不能在工作表或工作簿中工作

xlpyo6sf  于 2023-01-06  发布在  其他
关注(0)|答案(1)|浏览(156)

我正在学习错误处理,我想我已经掌握了窍门。但是我遇到了一个有趣的行为。我在我的类模块中处理我的错误,我把错误从堆栈中取出。我有可追溯性,所以当错误到达调用者时(或栈顶)显示一个错误,告诉我它发生在哪里。如果类是从模块调用的,它就能正常工作。但是如果类是从工作表或工作簿调用的,那么它会生成一个未处理的运行时错误。
例如,下面的代码:

sub testError
   err.raise -1000,,"This is a custom error"
end sub

如果我在一个常规模块中运行它,我会得到以下结果:

但如果我在工作表或工作簿中运行完全相同的代码,我会得到以下结果:

所以我的一些类是从工作表上的宏调用的,其他的是从工作簿和/或工作表事件调用的,如果一个已处理的错误发生了,我会得到一个未处理的运行时错误,没有任何有用的信息。
我可以把我的宏移到一个标准模块中,但是我不能把我的事件(值的改变,新的计算等等)移到一个标准模块中。
所以我有两个问题:为什么我不能在工作表/练习册上做错误提示?
我该怎么办呢?
谢谢。

2ekbmq32

2ekbmq321#

所以深入研究一下这个问题。VBA会给你两种错误弹出窗口:

  • 一个带有继续/结束/调试/帮助按钮
  • 一个带有确认/帮助按钮。

原来您只能使用带有end/debug按钮的弹出窗口修改描述。(通过err.raise)。
决定你看到的弹出窗口是栈顶的位置。如果是在标准模块中,你会看到"end/debug"弹出窗口。如果是在工作表/工作簿对象中,你会看到"okay/help"弹出窗口。
未处理的错误会一直出现在栈顶。如果栈顶在标准模块中,那么你可以选择按调试按钮,它会把你带到错误发生的那一行。如果栈顶在工作表/工作簿中,你就不知道它发生在哪里。
为了说明我的观点,下面的代码将抛出一个标准的运行时错误:

sub testError
   dim a as long
   a = clng("X")
end sub

如果这个方法在标准模块中运行,你会得到:

如果你在工作表/工作簿中运行它,你会得到这个:

后者在err.raise中不能很好地工作(你不能编辑描述)。
我的问题是我的宏和事件是在工作表/工作簿中启动的。这些方法然后调用模块中的其他方法。但是由于顶部堆栈位于工作表/工作簿中,所以我的错误处理就不起作用了。
所以我的工作是初始化我的模块级方法,把这些方法放在堆栈的顶部,然后它就工作了:

'standard module
sub createClass
   dim myObj as myClass
   set myObj = new myClass
   call myObj.raiseError
end sub

而不是从工作表/工作簿调用此方法,如下所示:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   call createClass
End Sub

请执行以下操作:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   application.run "createClass"
End Sub

这样做会将createClass方法放在堆栈的顶部。并且由于这是在标准模块中,错误处理将按预期工作。

相关问题