乐于分享
好东西不私藏

Excel VBA 编程基础 -- 错误处理(五)

Excel VBA 编程基础 -- 错误处理(五)
前面我们讲过了 VBA 的错误处理机制,也讲过了 VBA 自家错误号与推荐的用户自定义错误号的不同产生机制,现在我们来看看有哪些选项可以影响 VBA 的错误处理机制。
在 VBE 中,点击“工具” -> “选项……”,打开选项设置窗口,如图1所示:
图1 VBA 关于错误捕获的选项
由图可见,VBA 为错误捕获设置了三种选择:
  • 发生错误则中断(Break on All Errors)
  • 在类模块中中断(Break on Class Module)
  • 遇到未处理的错误时中断(Break on Unhandled Errors)
其中,第一项,发生错误则中断,当选择该项时,VBA 的所有错误捕获都失效,任何错误都会导致 VBA 的执行中断。效果见下图:
图2 发生错误则中断
这是选择第一项以后,执行带有错误捕获(On Error GoTo ErrorHandler)的过程时发生的情景。即使设置了错误捕获,VBA 在执行时忽略错误捕获设置,遇到错误时中断执行,等待用户干预。此时的效果就像没有设置任何错误捕获一样。
第二项,在类模块中中断,这个留待讲类模块时再讲。
第三项,遇到未处理的错误时中断,这是 VBA 的默认设置。在此设置下,如果 Sub/Function 中设置了错误捕获(通过各种 On Error 语句),则遇到错误时执行转到错误处理代码块,如果没有设置错误捕获,则 VBA 中断执行,等待用户干预。
下面讨论一个实例。
例1. 列出 VBA 的内置错误号及错误信息
前面我们说过,VBA 将错误号定义为位于区间 0 - 65535 之间的整数,其中,0 表示没有错误。因此,我们只需要列出 1 - 65535 之间的错误号,看看这些错误都是什么。见下图:
图3 列出 VBA 的错误号
对于每一个错误号,我们都用 Err.Raise 来引发,然后在 If ... End If 代码块中捕获所引发的错误,即可获得错误号和相关的错误信息,将这些信息写入 Excel 单元格,就获得了一张 VBA 的错误信息列表。
在 For ... Next 循环中,最后要用 On Error GoTo 0 来清零 Err 对象及当前的错误捕获设置,以便为下一轮的 On Error Resume Next 和 Err.Raise 做初始化。
返回值的错误通知机制
前面我们所讨论的都是引发错误及捕获错误。但关于错误的检查还有另外一种方式:检查函数的返回值以判断函数是否发生了错误。这有点类似于 Unix/C 的实现方式。
例2. 通过返回值来通知发生了错误
图4 通过返回值来通知发生了错误
在函数 Adding3 中,如果参数不是数值型字符串,则通过 CVErr() 函数将一个错误号转换子类型为 vbError 类型的变体类型,这就要求函数的类型必须是变体类型(Variant)。但这个错误号只能是 1 - 65535 之间的数值,不能是 VBA 推荐的 vbObjectError + n 形式的错误号。这凸显了 VBA 在错误处理上的不一致性。
在调用方,通过 IsError() 函数来判断函数的返回值是否是一个 vbError 类型的值,如果是,则说明调用函数时发生了错误。
但从图上可以看出,这种错误通知机制只能向上(调用者)报告错误号,调用者需要再通过查找错误信息表(如果有的话),才能直到到底发生了什么错误(Error() 函数就是这样的查表函数,它根据给出的错误号查找相应的错误信息,但返回的“应用程序定义或对象定义错误”表明错误号 30001 没有对应的错误信息)。而且,变体类型的函数也降低了函数调用的效率。
这个例子中使用了 VBA 的三个函数:
  • CVErr(errorNumber):将 errorNumber 包装为一个 vbError 的值返回。
  • IsError(expression):返回 Boolean 值以指示 expression 是否是一个错误值,即类型为 vbError 的值。
  • Error [(errorNumber)]:如果省略参数,Error 返回当前错误的错误信息,如果带有参数,则 Error 返回 errorNumber 所对应的错误信息,如果 errorNumber 没有对应的错误信息,则 Error 返回“应用程序定义或对象定义错误”(在中文环境下)或“Application-defined or object-defined error”(在英文环境下)。如果 errorNumber 不是合法的错误号,则 Error 发生错误。
说明:与本文有关的 Excel 文件已上传到夸克网盘,
文件名:Excel VBA Programming/ErrorHandling v5.xlsm
链接:https://pan.quark.cn/s/4a7059ee90f0
相关阅读
Excel VBA 编程基础 -- 错误处理(一)
Excel VBA 编程基础 -- 错误处理(二)
Excel VBA 编程基础 -- 错误处理(三)
Excel VBA 编程基础 -- 错误处理(四)