vba error

转自[url]http://zhiqiang.org/blog/it/handle-error-in-excel-vba.html[/url]

如果不提供错误处理方法,VBA在出错时会停留在出错之处。Excel/VBA提供On Error关键词来处理程序运行过程中的错误,具体有下面两种用法:
1.On Error Resume Next:当出错时跳到下一行继续运行。
2.On Error Goto Line:出错时跳到行号Line。这里行号Line可以为数字(不为0和-1),也可以为字符串。

其它与之相关的还有:
1.On Error Goto 0:运行后,对错误的捕获被关闭。程序出错时将自动中止。
2.On Error Goto -1:运行后,「Resume」和「Resume Next」将失效。
3.Resume:跳回并重新运行出错的行
4.Resume Next:跳回并运行出错位置的下一行。

上面各种语句的组合可以非常复杂。下面是我半天时间的研究成果。

1.VBA处理出错的两种方式

设置On Error Resume Next在出错时直接运行下一行,然后可以通过Err.Number来判断是否出错然后进行相关处理。
Sub Demo1()
On Error Resume Next

Call doing_thing1
If Err.Number > 0 Then
Call err_handler1 ' err handler deals with err in doing_thing2
Err.Clear
End If

Call doing_thing2
If Err.Number > 0 Then
Call err_handler2 ' err handler deals with err in doing_thing2
Err.Clear
End If

On Error GoTo 0
Call doing_next_thing
End Sub

On Error Goto Line的方法更强大,在错误处理完毕之后还可以通过Resume或Resume Next返回原出错点或出错点的下一行。
Sub Demo2()
On Error GoTo err_handler_line1
Call doing_thing1

On Error GoTo err_handler_line1
Call doing_thing2

On Error Resume Next ' On Error Resume Next和 On Error Goto可以混着用
Call doing_next_thing

Exit Sub

err_handler_line1:
Call err_handler1
Resume ' return and re-run the error line
' 上面一行Resume、Resume Next、Exit Sub可根据情况任选其一
' 而且必须选一个,否则doing_thing1出错时,下面的Err_hander2也会被运行
err_handler_line2:
Call err_handler2
Resume Next ' resume to next of the error line
End Sub

2.Err变量

VBA有一个全局变量Err,它保存了程序运行过程中出现的最后一个错误的相关信息(比如错误编码、错误描述等)。一般我们可以通过Err.Number > 0来判断是否出错;通过Err.Description查看具体出错信息。

Err可以通过Err.Clear手工清除。

VBA在每次碰到On Error Resume Next、On Error Goto、Resume、Resume Next都会自动清空Err。我们需注意重复设置错误处理代码的副作用。比如在上面Demo2添加一行,后面的错误处理程序就失效了:
Sub Demo3()
On Error Resume Next
Call doing_thing '?如果此处出错,Err将保存错误信息

On Error Resume Next ' 此处Err对象被清空

If Err.Number > 0 Then
Call err_handler ' 由于Error被清空,此处错误处理程序已经失效。
Err.Clear
End If

Call doing_next_thing
End Sub

Err是全局变量,母函数的错误信息会带入到子函数,子函数的错误信息也会被返回母函数。但实际表现非常复杂,具体请参考本文第五部分。

3.isErrorHanderEnabled

VBA里对错误处理有两个状态。一个是isErrorHanderEnabled,另一个是isErrorHanderActive。这两个变量名不是真实的变量,只是为了更好解释这个问题。

isErrorHanderEnabled指目前是否捕获程序发生的错误,具体而言即是否设置了On Error Resume Next或On Error Goto Line。如果isErrorHanderEnabled == False,一旦某行代码出错,VBA便会中止运行,并提示出错。如果isErrorHanderEnabled == True,则按照设置方法,VBA在出错后直接跳转或者继续运行下一行。

On Error Goto 0相当于取消前面设置的On Error Resume Next和On Error Goto Line,即重设isErrorHanderEnabled = False。接下来代码运行过程中一旦出错,便会中止运行。

isErrorHanderEnabled是一个局部变量,即子函数和母函数的状态互不影响。每个函数刚开始时,isErrorHanderEnabled的默认状态都是False。

4.isErrorHanderActive

isErrorHanderActive是指VBA现在是否正在处理错误。如果设置了On Error Goto Line,然后程序出错时,此时程序自动跳转到Line位置开始运行,并设置isErrorHanderActive = True。

On Error Goto -1用来告诉VBA目前错误已经处理完毕,VBA应该回到正常运行状态,并设置isErrorHanderActive = False。

和isErrorHanderActive一样,isErrorHanderEnabled也是一个局部变量,即子函数和母函数的状态互不影响。每个函数刚开始时,isErrorHanderActive的默认状态也是False。

需注意isErrorHanderActive和Err.Number>0并无直接关系,比如下面例子:
Sub Demo5()
Dim i As Long
On Error Resume Next
i = 1 / 0 ' err occurs
MsgBox "Here: Err.Number > 0 but isErrorHanderActive = False"

On Error GoTo err_handler:
i = 1 / 0 ' err occurs, set isErrorHanderActive = True

err_handler:
On Error Resume Next ' this will clear err
MsgBox "Here: Err.Number = 0 but isErrorHanderActive = True"
End Sub

5.函数调用时发生什么?

VBA的子函数和母函数在处理错误之间的关系比较复杂。一般情况尽量让各自函数处理各自的问题,避免子函数将错误抛给母函数。

在子函数和母函数处理错误时,有两个问题值得讨论:1)子函数的Err变量信息是否传回给母函数;2)子函数的错误是否会触发母函数的错误处理程序。

结合MSDN相关文档和各种测试案例,我发现:
•母函数在进入子函数时,Err变量保存不变,错误信息传入子函数,但不会触发子函数的错误处理程序。
•子函数在On Error Resume Next后形成的错误信息会将向上传递给母函数,但不会触发母函数的错误处理。
•子函数在On Error Goto Line后形成的错误信息不会向上传递给母函数,也不会触发母函数的错误处理。
•子函数在On Error Goto Line跳转后处理错误过程中一旦形成新错误,将触发母函数的错误处理程序;同时如果母函数的错误处理方式是On Error Resume Next,子函数继续运行,并且子函数的错误信息将传给母函数;如果母函数错误方式是On Error Goto Line,子函数终止运行,跳回母函数的错误处理处,但子函数的错误信息并不会向上传递给母函数(即这种情况下,母函数只知道子函数有错位未被处理,但不知道任何错误信息)。

第四种情况子函数错误触发母函数的错误处理程序的原因是当子函数的isErrorHanderActive == True时,子函数的错误处理将被母函数接管,此时子函数一旦出错,错误上传的方式和第二条第三条的一样的,只不过决定于母函数的错误处理方式是「On Error Resume Next」还是「On Error Goto Line」

下面这几个测试案例展示了上述行为特征:
Sub Demo4()
On Error GoTo err_hander1
Call Demo4_Sub1
Debug.Print "Err in sub1:" & Err.Description ' Err description = ""

On Error GoTo err_hander2
Call Demo4_Sub2
Debug.Print "Err in sub2:" & Err.Description ' Err description <> ""

On Error GoTo err_hander3
Call Demo4_Sub3
Debug.Print "Err in sub3:" & Err.Description ' Err description = ""

On Error Resume Next
Call Demo4_Sub4
Debug.Print "Err in sub4:" & Err.Description ' Err description <> ""

Exit Sub
err_hander1:
Debug.Print "err_hander1 incurred" ' not incurred
Resume Next

err_hander2:
Debug.Print "err_hander2 incurred" ' not incurred
Resume Next

err_hander3:
Debug.Print "err_hander3 incurred" ' incurred
Resume Next

err_hander4:
Debug.Print "err_hander4 incurred" ' incurred
Resume Next
End Sub

Sub Demo4_Sub1()
On Error GoTo err_hander

Dim i As Long
i = 1 / 0

Exit Sub
err_hander:
Resume Next
End Sub

Sub Demo4_Sub2()
On Error Resume Next

Dim i As Long
i = 1 / 0
End Sub

Sub Demo4_Sub3()
On Error GoTo err_hander

Dim i As Long
i = 1 / 0

Exit Sub
err_hander:
i = 1 / 0
Resume Next
End Sub

Sub Demo4_Sub4()
On Error GoTo err_hander

Dim i As Long
i = 1 / 0

Exit Sub
err_hander:
i = 1 / 0
Resume Next
End Sub

6.其它一些注意点

6.1.警惕 On Error Resume Next的副作用

一旦启用On Error Resume Next,所有错误都会被自动略过。除非有足够信心,不要用它。启用之后也尽快使用On Error Goto 0关闭它。

另外还要注意副作用。比如If的条件一旦出错,If内部的语句将被执行,这和直观想象并不相符。
Sub Demo6()
On Error Resume Next
Dim i As Long
i = 0
If 0 / 0 Then i = 1

MsgBox i ' i = 1
End Sub


6.2.单元格错误也会触发VBA错误

在VBA中引用单元格的值,如果单元格里是一个公式并且公式出错,那么VBA中连带会抛出一个错误。

6.3.选项中可选强制发生错误时中断程序

在VB编辑器的 工具 - 选项 - 通用 - 错误捕获 选项里,可以强制在程序发生错误时中断程序。这在调试程序时非常有用。

6.4.编程小细节

1)在错误处理程序之前添加Exit Sub或Exit Function,避免程序位出错时也运行错误处理程序。

2)在每个错误程序后都添加Resume、Resume Next、Exit Sub或Exit Function,避免从当前错误处理之后继续运行后面的错误处理程序。
VBA 巧用 On Error GoTo,Exit Function/Exit Sub,Resume Set TextObj = FileObj.OpenTextFile(strPath)  Do While Not TextObj.AtEndOfStream    Dim Line$, DateStr$, Curentdatestr$, Datecountstr$    Line = TextObj.ReadLine    Curentdatestr = Left(Line, 10) 阅读详情

相关推荐

VBA编程中Nothing、Empty、Null与Error的深度解析与实战应用

在编程语言中,变量与数据的空值处理是基础且关键的概念,它直接影响程序的稳定性和逻辑正确性。从原理上讲,不同的空值类型代表了不同的数据状态:未初始化的变量、不存在的对象引用、未知的数据或特定的错误标识。理解这些差异对于编写健壮的代码至关重要,尤其是在处理外部数据源(如数据库、Excel单元格)时。在VBA(Visual Basic for Applications)这一广泛应用于Office自动化的语言中,空值处理尤为复杂,涉及Nothing、Empty、Null和Error等多个关键字。这些概念在数据库交互

weixin_28700593的博客 277

VBA错误处理

VBA错误处理相关

me_to_007的博客 9852

VBA编程中Nothing、Empty、Null与Error的深度辨析与实战应用

在编程语言中,对变量状态的精确判断是构建健壮程序的基础。VBA作为广泛应用于Office自动化的语言,其数据类型系统包含几种特殊的“非正常值”,它们分别代表了不同的数据概念和内存状态。理解这些值的本质差异,是避免逻辑错误、提升代码质量的关键。Nothing特指对象引用缺失,必须使用Is运算符判断;Empty是Variant类型的初始未赋值状态,需用IsEmpty函数检测;Null来源于数据库,代表未知或缺失值,具有传播性,必须用IsNull函数识别;Error则封装了运行时错误信息,需用IsError函数处

weixin_32006655的博客 346

VBA实战篇学习笔记02 Err错误处理

05:56 Err全局对象< Number || Description || Clear >一旦执行本语句,后面所代码在出错时,都恢复为VBA默认的错误处理方式(弹出错误并中断程序运行)在正常语句之后,错误处理语句之前加上: Exit Sub,则不会自动进入错误处理语句。05:55 错误代码91: 对象变量或者with变量未设置。让程序跳转到刚刚发生错误的语句上重新执行⇒ 注意会发生死循环。08:14 错误代码1004: 视具体错误类型而变化。01:47 错误代码13: 类型不匹配。

pigerr的博客 1569

VBA编程中Nothing、Empty、Null与Error的深度解析与实战处理

在编程语言中,数据类型与特殊值处理是构建健壮应用的基础。从内存管理原理来看,变量在声明、赋值及运算过程中可能处于多种特殊状态,理解这些状态对于确保数据处理的准确性和程序稳定性至关重要。在VBA(Visual Basic for Applications)环境中,这体现为对Nothing、Empty、Null和Error四种核心“空值”概念的精准把握。Nothing关乎对象引用的生命周期管理,Empty标识Variant变量的初始未赋值状态,Null代表数据库领域的未知数据,而Error则封装了运行时错误信息

weixin_29200741的博客 279

从安全通道到适配器选择,SAP Cloud Integration 协议设计的项目化理解

本文探讨了SAP Cloud Integration设计的核心问题,指出通信协议的选择比具体技术实现更能决定集成的长期稳定性。文章分析了HTTPS、SFTP和SMTP三类主要通信通道的适用场景:HTTPS适合实时API交互,但需处理复杂的安全配置;SFTP适用于批量文件传输,需注意文件处理流程;SMTP可用于业务邮件集成,但需防范内容风险。此外,还介绍了OData、RFC等专用适配器的使用场景,强调适配器选择应基于系统类型而非通用协议。文章特别指出,理解通信方向(Inbound/Outbound)对安全设计

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1974

Excel VBA:单元格错误值

可将单元格错误值插入单元格,或者用 CVErr函数测试单元格的值是否为某个错误值。单元格错误值可为以下 XlCVError 常量之一。 常量 错误号 单元格错误值 xlErrDiv0 2007 #DIV/0! xlErrNA 2042 #N/A xlErrName 2029 #NAME? xlErrNull 2000 #NU

刘岩的专栏 6078

CDO批量处理nc文件:5分钟搞定CMIP6数据双线性插值(附完整代码)

本文详细介绍了如何使用CDO工具链中的`remapbil`命令,快速实现CMIP6数据的批量双线性插值处理。通过环境配置、核心操作步骤、高级优化技巧及典型报错解决方案,帮助科研人员高效处理大规模nc文件,显著提升气象数据处理效率。

weixin_29267307的博客 292

VBA的3种错误处理方式 on error goto 0 /-1 , on error resume next , on error goto index,是抛出异常,还是忽略报错,还是进行错误捕捉?

VBA的错误捕捉和 错误处理语句 on error goto on error resume next if then end if if then end if if then end if

奔跑的犀牛先生 1万+

CST--时域仿真的网格设置技巧

对于物理概念清晰的工程师而言,使用时域算法几乎能够解决所有电磁仿真问题,但是,掌握时域算法的仿真技巧比掌握频域的难度大,这恐怕也是很多仿真工程师更喜欢使用频域算法的原因,因此,对于时域算法的灵活应用更能考验你是否是一名合格的仿真工程师。

一只豌豆象的博客 6861

【k8s面试】超详细kubernetes面试题总结,面试必问!(附200道K8s Docker面试真题+答案详解

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

2401_83620959的博客 1465

【VBA中,`On Error GoTo 0` 的作用】

是VBA中“关闭自定义错误捕获”的语句,用于在不需要捕获错误的代码段前恢复默认报错行为,确保后续代码的错误能被及时发现(而非被静默忽略)。

qq_33764107的博客 425

麻辣香锅病毒分析

Spicy Hot Pot浏览器劫持病毒(麻辣香锅病毒)从2020年初被安全公司监测到,因其病毒模块带有MLXG_KM被安全行业代称麻辣香锅病毒。目前通过各种激活工具传播, 包括暴风激活、小马激活和KMS激活等诸多工具,疑似与下载站进行合作推广此类激活工具。Spicy Hot Pot 是一个浏览器劫持 Rootkit,它会将用户的主页更改为指向恶意软件操作员控制的页面,此外还会将内存转储从机器上传到预定义的服务器,并结合本地更新功能以确保其保持更新。通常浏览器劫持者会通过更改用户主页的恶意可执行文件或注册表

不忘初心,护天下安全! 4788

CATIA VBA脚本报错:Automation error Unspecified error

该问题主要来自于复杂几何文件在自动化处理过程中的更新(刷新),导致程序卡死崩溃。输出数据本身没有错误,通过写断点续算程序重启脚本可继续进行计算。网上资料表明对于几何崩溃的情况,可以使用CATDUA模块进行清理,后续可进行尝试。通过查询互联网相关信息,该错误是一个通用的未知细节错误。对该错误的原因进行了检索和确认。

AWP0000125的博客 46

2026 拉勾网:JA4+指纹绕过 + sign逆向 + 动态城市参数,月采集10万+数据实战

2026年拉勾网反爬技术全面升级,采用JA4+ TLS指纹识别、动态sign签名等多维度防护体系。本文提供工业级爬虫解决方案,通过curl_cffi模拟浏览器指纹、逆向sign加密算法、动态生成城市参数三大核心技术,实现高效稳定的数据采集。系统采用分层架构设计,包含任务调度、签名生成、多线程引擎等模块,单月可获取10万+条招聘数据。重点解析了JA4+指纹识别原理、传统方法的局限性,以及通过HMAC-SHA256算法逆向sign参数的完整过程。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2394

Error Handling In VBA

<br />http://www.cpearson.com/excel/ErrorHandling.htm<br /> <br />Pearson Software Consulting Services<br />    Error Handling In VBA <br />           Introduction<br />Error handling refers to the programming practice of anticipating and coding for error

sduzhijian的专栏 1315

四足狗机器人硬件开发技术栈详解

本文系统介绍了四足狗机器人的硬件开发技术,重点分析了五大核心模块:机械结构(骨架设计)、动力系统(关节驱动)、感知系统(环境监测)、控制系统(决策中枢)和电源系统(能源管理)。文章详细阐述了各模块的选型标准、技术要点和协同设计原则,提供了从需求定位到组装调试的完整开发流程,并针对常见问题给出解决方案。随着材料轻量化、模块标准化和AI集成化的发展趋势,四足机器人硬件将向更灵活、更智能的方向演进,为工业巡检、应急救援等场景提供更强大的移动平台支持。

start_up_go的博客 284

vba下标越界9怎么解决_VBA多维数组的“扁平化处理”—— On Error Resume Next

这是我今天碰到的来自一个妹子工作中的实际问题:需要对下面数据进行清洗转换。数据源(数据已简化):要求结果:示例只是为了表达处理前后的变化效果,实际上数据样式是比较复杂的。读者们觉得可以用透视表做的,可以试下怎么处理。当然,这是一个批量处理的问题,即使透视表能做,也架不住天天手动做几十个表格 :(正题:难点介绍处理数据的时候,发现这是个多维数组,且数组内的元素(本身也是数组),长度不一:这...

weixin_39902875的博客 3301

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

VBA Error Handling On Error Resume Next

<br />http://vbaexcel.eu/vba-macro-code/vba-error-handling-on-error-resume-next<br /> <br /> <br />This macro code enables the On Error Resume Next function.Explanation<br />To enable On Error Resume Next will make the VBA program skip code that generates

sduzhijian的专栏 1831

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Handle Error in VBA

If you don't use an On Error statement, any run-time error of VBA that occurs is fatal; that is, an error message is displayed and execution

tomiter的专栏 890

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

VBA错误处理实战:从On Error语法到全局错误处理框架

错误处理是编程中保障程序稳定运行的关键基础,在VBA开发中更是如此。许多开发者使用VBA处理Excel数据或编写宏时,常因错误处理不当导致程序意外中断,甚至造成数据丢失。掌握On Error语句和Err对象的原理,是构建健壮VBA代码的前提。On Error Resume Next、GoTo Label等不同模式各有适用场景,合理配合Err.Clear与日志记录,可以构建一套可复用的全局错误处理框架,让程序在遇到文件缺失、数据异常等状况时依然可控。这不仅能提升Excel宏的可靠性与易维护性,让代码从仅能跑通

weixin_33491377的博客 320

Access VBA Error 1004

Error 1004: Application defined or object defined error. The error is most due to the nonexistence of visiting data in script. 这个错误大部分情况是由于脚本中访问的数据不存所致。

桃花谷主 999

VBA错误处理实战:On Error与Err对象从入门到排查手册

在办公自动化与Excel宏开发中,程序崩溃往往源于对运行时异常缺乏有效管理。VBA作为一种解释型语言,许多错误直到执行阶段才会暴露,因此掌握错误处理机制是交付稳定脚本的基础。通过理解On Error语句的三种形态、Err对象的核心属性以及统一错误出口的设计模式,开发者可以构建出具备自我诊断能力的宏程序。这类技术不仅适用于Excel,也能迁移至WPS表格等支持VBA的办公软件,帮助用户在批量数据处理、报表生成等常见场景中快速定位问题并恢复现场,避免产生半成品数据。本文从基础概念出发,逐步演示如何用结构化的错误

weixin_31102231的博客 249

Error: VBA initialization failed

Article ID:35334Software: ArcGIS - ArcEditor 9.2, 9.3, 9.3.1 ArcGIS - ArcInfo 9.2, 9.3, 9.3.1 ArcGIS - ArcView 9.2, 9.3, 9.3.1Platforms: Windows XP, 2003Server, VistaError MessageWhen attempting to open ArcMap, the following error message is returned: <br

ychh_hjr的专栏 2416
上一篇: vba ado transation
下一篇: vba command call procedure
tangleisoft
博客等级 码龄16年 8粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值