EXCEL VBA 错误处理一个小技巧

如题所述

编写复杂的VBA宏时,错误在所难免。自己调试时,通过Debug功能轻松解决。然而,当宏被他人使用时,问题就来了。他们遇到问题都会来找你,而且现场调试别人的电脑也让人压力山大。这时,就需要考虑错误处理的问题。

错误处理的目的是帮助快速调试并绕过不重要的错误。

VBA默认的错误处理是On Error GoTo 0,即在出现问题时显示错误,用户可以通过点击OK退出或进入VBE调试。这种方式对用户不友好,对编码者信息不足。因此,我们需要自定义错误处理,常用的方法有两种:On Error GoTo label/Line和On Error Resume Next。

通常的做法是在代码前设置On Error GoTo 标签,然后在标签中包含错误处理。例如:

然而,很多时候一个错误标签不够用,多个标签又太麻烦。因为既要编写标签,又要在前面正确的地方引用它,这会增加不少工作量。

以下是我的做法:一个处理变量 + 一个错误标签。这个变量包含代码的逻辑描述,我常常用它来代替注释,或者将注释放入变量中。这样,代码一路下来这个变量都会更新到最新的注释。然后我只设置一个错误处理标签,在其中使用这个变量来处理错误。

这种做法的最大好处是处理错误非常方便。

例如,我通常先设置一个简单的设置,留个变量q,在需要注释的地方加上q="01 注释",甚至什么都不加,让q等于空。然后,在出现错误时使用MsgBox显示Err.Description和Err.Number以及q的值。

通常情况下,出现常见的错误,只需在q中添加新的注释即可。细分处理也方便,通过一次设置select case,在其中添加Case left(q,20)条件即可。

需要指出的是,原则上很多错误都应通过修改代码来解决,但因为我不是专业的程序员,有时会比较懒,而且有些错误可能无法处理。例如,我有一个宏每天自动执行约50个Excel宏,经常会遇到权限错误和文件损坏错误。

网上关于VBA错误处理的文章大多建议不使用On Error Resume Next,将其视为程序员懒惰的表现之一。但我认为,如果紧跟On Error Resume Next的代码比较简单,且功能单一,那么On Error Resume Next未尝不是On Error GoTo Label的一个补充。

大家是否经常想VBA为什么没有像函数一样的Iferror syntax呢?每次都要使用On Error GoTo Label确实很麻烦。我有一个想法,使用On Error Resume Next和If Err.Number > 0可以做一个轻量级的错误处理。具体做法如下:

例如,我有一个宏打开其他Excel文件并执行其中的宏。文件夹中有时会有损坏的文件。当宏打开这些文件时,会出现错误并停止。以下代码尝试处理这种情况:

1. 首先,判断文件是否存在,path存储文件地址。

2. 在打开文件前,放置On Error Resume Next,这样如果紧跟着的打开文件代码出现问题,就跳到下一行。

3. 如果在打开过程中出现错误(重点是虽然跳过了错误,但错误码仍然存在,Err.Number不等于0),就关闭打开的文件,并尝试使用xlRepairFile参数重新打开文件进行修复。这里还有一个可能,即第二步文件没有打开,如果没有前面On Error Resume Next,这一步关闭文件也会出错。

如果你能耐心看到这里,说明我们都是同行。握手,握手 :) 祝大家工作顺利,生活愉快!哈,逃)
温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜