Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Excel VBA解读(164):错误处理技术之On Error语句

Excel VBA解读(164):错误处理技术之On Error语句

作者头像
fanjy
发布于 2020-01-13 03:09:47
发布于 2020-01-13 03:09:47
10.5K0
举报
文章被收录于专栏:完美Excel完美Excel

学习Excel技术,关注微信公众号:

Excelperfect

好的应用程序应该能够捕获错误并进行相应的处理,而不是VBA弹出的错误消息。正如上文提到的,有两种方法处理运行时错误。对于可预见的错误,编写特定的代码来处理它们。对于不可预见的意外错误,则使用VBA错误处理语句来处理。

在VBA中,On Error语句用于错误处理。当代码运行时发生错误时,该语句将执行相应操作。

On Error语句有4种不同的使用方式:

1.On Error GoTo 0

代码停止运行在出现错误的行并显示错误消息。

2.On Error GoTo [标签]

当错误发生时,代码移至指定的行或标签处,不会显示错误消息。

3.On Error GoTo -1

清除当前错误。

4.On Error Resume Next

当错误发生时,代码移至下一行继续执行,不会显示错误消息。

On Error GoTo 0

这是VBA默认的处理错误的操作。

发生错误时,VBA将在出现错误的行上停止运行并显示错误消息。此时,需要用户干预代码才能继续。在这种情况下不会发生错误处理。

让我们看一个例子。在下面的代码中,我们没有使用任何On Error语句,因此VBA默认情况下将使用On Error GoTo 0操作。

Sub DefaultErrorHandle()

Dim x As Long

Dim y As Long

x = 6

y = 6 / 0

x = 7

End Sub

在代码中,使用了0作为除数,因此在运行代码时,将会出现如下图4所示的错误消息。

图4

发生错误时,会导致应用程序中止。如果应用程序已经提供给用户使用而出现错误,这是非常不友好的。可以使用On Error GoTO [标签]语句,让错误发生时执行标签处预先定义的操作,避免应用程序中止。

On Error GoTo [标签]

当发生错误时,会将错误发送到指定的标签,通常位于过程的底部。

如下面的代码:

Sub GotoLabel()

Dim x As Long

Dim y As Long

On Error GoTo errH

x = 6

y = 6 / 0

x = 7

Done:

Exit Sub

errH:

MsgBox "发生了错误: "& Err.Description

EndSub

运行代码的结果如下图5所示。

图5

运行上述VBA代码,代码执行到以0作为除数这一行时,发生错误,代码跳至On Error GoTo 语句指定的标签errH处。

On Error GoTo -1

这个语句用于清除当前发生的错误。如果又发生另一个错误,代码将在发生错误行停止。

如下面的代码所示:

Sub TwoErrors()

On Error GoTo errH

'产生"类型不匹配"错误

Error (13)

Done:

Exit Sub

errH:

'产生"应用程序定义"错误

Error (1034)

End Sub

代码中发生的第一个错误导致代码跳至标签errH处,而第二个错误会导致代码直接停止在错误行,如下图6所示。

图6

而在标签语句内添加的错误处理因前面的错误尚未清除而不会起作用,如下面的代码:

Sub TwoErrors()

On Error GoTo errH

'产生"类型不匹配"错误

Error (13)

Done:

Exit Sub

errH:

On Error GoTo errH_Two

'产生"应用程序定义"错误

Error (1034)

Exit Sub

errH_Two:

Debug.Print "发生另一错误: "& Err.Description

End Sub

运行代码后,会弹出错误消息框,单击“调试”按钮,会停止在错误行,如下图7所示。

图7

要清除已发生的错误,使用On Error GoTo -1。在下面的代码中,我们添加了该语句,这样第二个错误会导致代码跳至errH_Two标签处:

Sub TwoErrors()

On Error GoTo errH

'产生"类型不匹配"错误

Error (13)

Done:

Exit Sub

errH:

'清除错误

On Error GoTo -1

On Error GoTo errH_Two

'产生"应用程序定义"错误

Error (1034)

Exit Sub

errH_Two:

MsgBox "发生另一错误: "& Err.Description

End Sub

运行上述代码后的结果如下图8所示。

图8

On Error Resume Next

使用On Error Resume Next语句,告诉VBA忽略错误并继续执行。

下面的代码会正常执行而不会报错:

Sub ResumeNext()

On Error Resume Next

Dim x As Long

Dim y As Long

x = 6

y = 6 / 0

x = 7

End Sub

有些错误无关紧要,可以忽略不计而不会有什么问题。但是,这样做并不是很好,因为程序中存在的错误往往会以多种方式影响程序自身,最终可能会获得无用的结果,并且你也不知道程序到底发生了什么问题。

然而,在有些情形下On Error Resume Next却很有用,在正文中会提供具体的例子。使用On Error Resume Next语句的一个原则是,其所影响的代码应该尽可能的少,当不再需要该语句时应及时关闭它。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 完美Excel 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Excel VBA解读(163):错误处理技术之概述
在VBA代码中,我们经常会看到类似于On Error Resume Next这样的语句,这是编译器在代码遇到错误时自动处理的语句。有时候,在代码中进行适当的错误处理,可以使代码在实际应用后更健壮,避免由于各种原因导致的代码异常给用户带来的困扰。
fanjy
2020/01/13
4.3K0
Excel VBA解读(163):错误处理技术之概述
Excel实战技巧74: 在工作表中创建搜索框来查找数据
如下图1所示,在数据区域上方放置有一个文本框,用来输入要搜索的文本,其名称重命名为“MySearch”;一个用作按钮的矩形形状,点击它开始搜索并显示结果;两个选项按钮窗体控件,用来选择在数据区域的哪列进行搜索。
fanjy
2020/02/18
17.7K1
Excel VBA解读(160): 数据结构—字典对象的基本操作(续)
Set dict = CreateObject("Scripting.Dictionary")
fanjy
2019/08/29
3.3K0
Excel VBA解读(160): 数据结构—字典对象的基本操作(续)
Excel应用实践10:合并多个工作簿中的数据
我有超过50个具有相同格式的Excel文件,它们的列标题相同,并且都放置在同一文件夹,有什么快速的方法将它们合并到一个单独的Excel文件的一个工作表中?
fanjy
2019/07/19
2.6K0
VBA专题06-6:利用Excel中的数据自动化构建Word文档—Excel与Word整合示例3
从前面的学习中,我们已经学会了使用书签将Excel中提取的数据放置到文档中指定的位置。下面的示例演示如何运用这些技巧,使用Excel分析得来的数据来生成多个报表。
fanjy
2019/10/09
2.5K0
VBA专题06-6:利用Excel中的数据自动化构建Word文档—Excel与Word整合示例3
VBA实战技巧07: 阻止用户按Ctrl+Break键中断代码运行
当运行中的代码长时间没有响应,或者代码陷入死循环时,可以按Ctrl+Break键中断代码的执行(注:有些笔记本电脑的键盘上没有Break键,可以按Esc键)。此时,VBA会弹出如下图1所示的消息。
fanjy
2020/05/04
2.9K0
Excel VBA编程
在Excel中,数据只有文本,数值,日期值,逻辑值和错误值五种类型。但是在VBA中,数据类型跟Excel不完全相同。根据数据的特点,VBA将数据分为布尔型(boolean),字节型(byte),整数型(integer),单精度浮点型(single),双精度浮点型(double),货币型(currency),小数型(decimal),字符串型(string),日期型(date),对象型等等
全栈程序员站长
2022/08/11
47.9K0
Excel VBA编程
Vba菜鸟教程[通俗易懂]
官方文档:https://docs.microsoft.com/zh-cn/office/vba/api/overview/language-reference 代码完成后:工具-vbaproject属性-保护-查看时锁定-密码
全栈程序员站长
2022/09/05
18.4K0
Vba菜鸟教程[通俗易懂]
VBA二维表转一维表
工作中经常会碰到这种情况,外部收集来的资料,表格制作者为了排版好看,做成转换前的格式,这种格式看起来方便,但是做数据处理是非常不方便的,需要进行转换后进行数据处理。
xyj
2020/07/28
1.8K0
VBA二维表转一维表
使用VBA复制文件的5个实战示例
下面的代码将C盘“test”文件夹下的文件books.xlsx复制到D盘“完美Excel”文件夹中。
fanjy
2023/08/29
1.7K0
使用VBA复制文件的5个实战示例
一起学Excel专业开发18:Excel工时报表与分析系统开发(2)——创建特定应用加载宏(续)
图1所示的自定义工具栏中的第一个按钮的作用是将工时输入工作簿的副本保存到合并区,其代码如下:
fanjy
2019/10/22
1.4K0
一起学Excel专业开发18:Excel工时报表与分析系统开发(2)——创建特定应用加载宏(续)
Excel VBA解读(134): 使用Excel函数提高自定义函数的效率
在上篇文章中,我们展示了自定义函数有效的方式是通过将单元格区域读取到Variant型数组来传递单元格区域数据。本文将介绍在自定义函数中最有效的方式是使用Excel内置函数。
fanjy
2019/07/19
3.5K0
Excel VBA解读(134): 使用Excel函数提高自定义函数的效率
Word VBA技术:快速调整表格大小以适应页面宽度
有时候,文档中的表格有大有小且并不一定与页面同宽,或者页面宽度调整之后,表格仍保持原样。如果我们想将表格的大小调整为与页面宽度相同,并且保持各列单元格中原有的相对列宽,那么可以使用VBA来解决。
fanjy
2023/02/24
2.2K0
Excel揭秘22:其实可以在编写VBA代码时直接添加行号
很多现代的代码编辑器在其左侧都会显示代码所在行的行号,然而在VBE中输入代码时,我们看不到行号,其实,我们可以在输入代码时直接手工添加行号。
fanjy
2020/01/14
2.4K0
Excel揭秘22:其实可以在编写VBA代码时直接添加行号
VBA技术:你需要知道的一些VBA操作形状的代码
在Excel中,可以通过功能区“插入”选项卡“插图”组中的“形状”库按钮在工作表中插入形状。可以使用形状来可视化数据、在形状中添加文本、作为执行宏代码的按钮,等等。
fanjy
2023/02/24
5.2K0
VBA技术:你需要知道的一些VBA操作形状的代码
一起学Excel专业开发16:使用表驱动的方法管理工作表用户接口
在工作表中存储需要完成的任务,代码从工作表中读取这些任务并执行,从而完成相应的操作,这就是表驱动方法。
fanjy
2019/10/22
1.1K0
一起学Excel专业开发16:使用表驱动的方法管理工作表用户接口
Excel VBA解读(145): MaxMinFair资源分配——一个数组UDF示例
本文主要介绍使用VBA自定义函数(UDF)实现一个名叫MaxMinFair的有趣的算法。
fanjy
2019/07/19
1.8K0
仿Excel的撤销功能
这是在www.vbaexpress.com中看到的一个示例,实现了自己以前想做而未做的事情。
fanjy
2024/05/13
3020
仿Excel的撤销功能
VBA实用小程序79:统计不同值或唯一值的VBA自定义函数
我们说,这组数据有6个不同值:a,b,c,d,e,f;有3个唯一值:c,d,f,因为它们在列表中只出现了1次。
fanjy
2021/07/12
2K0
VBA实用小程序79:统计不同值或唯一值的VBA自定义函数
在Excel中自定义上下文菜单(上)
上下文菜单(也称为快捷菜单)是在一些随用户交互之后出现的菜单,通常是鼠标右键单击操作。在Microsoft Office中,上下文菜单提供了一组在应用程序的当前状态或上下文中可用的有限选项。通常,可用的选择是与选定对象(如单元格或列)相关的操作。
fanjy
2022/11/16
3.2K0
在Excel中自定义上下文菜单(上)
推荐阅读
相关推荐
Excel VBA解读(163):错误处理技术之概述
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档