excelvba开启失败(EXCELVBA学习笔记错误处理语句)
编写代码总会出现意想不到的错误,VBA中对这些错误有怎样的功能提供给代码编写者?
一、On Error Resume Next 忽略错误继续执行语句下一条。此语句执行后,其后面的语句产生的错误都会被忽略(且不会给出任何提示),坚定地继续执行下一语句。如果有Do Loop循环语句,极易产生死循环。所以此语句用起来最简单,但也极易产生大问题。
二、On Error Goto “标签” VBA提供的更为良性的错误处理语句。发生错误后跳转到“标签”的语句,标签后面的语句写上应对不同错误的代码。那么怎么知道出现的错误是哪个类别的呢?
VBA提供了1个Err 对象。Err 对象 代表最近一次发生的程序运行时的错误。
Err.Number 属性:指错误代码。就是下图中的“13”。
VBA的错误都有类似的代码,只是同样的错误代码,有时指示的意思有很大差别,让人很难搞清是哪里的代码出问题了。Err.Number 是个可写的属性,可以Goto 到错误处理语句,执行完语句后,将Err.Number=0 0代表没有产生错误,大于0就表示有错误产生。
Err.Description 属性:该错误的描述。如上图的“类型不匹配”,此描述对于判断错误原因基本没什么用。
Err.Clear 方法:将Err的内容清空。
例句:
On Error GoTo wrong
n = 0 \ 0 '执行此句,会产生错误,就会跳转到wrong: 标签。因上面语句,不会产生弹窗。
Exit sub '此句用于隔离 错误处理语句与主语句。避免主语句执行完后,还要运行错误处理语句
wrong:
IF Err.Number > 0 Then
Msgbox “产生了未知的错误,请检查”
End if
Resume Next '返回产生错误的语句,并执行其下一条语句
三、On Error Goto 0 恢复默认的VBA处理错误的方式,即弹出错误提示,并中断程序运行。
下面介绍几种错误的产生原因,及处理办法:
1、类型不匹配,错误代码“13”
(1)赋值与声明类型不符合。在数组应用中,此错误极易遇上。
dim arr() As String
arr = Range("A1:B2") '此时会产生 类型不匹配 错误
//单元格赋值给数组时,不可以对arr() 声明具体类型。只能 Dim arr() 或 Dim arr() As Variant,就是变体类型,否则必报“13”号错误。
//因为VBA认为单元格里会存储任何类型的数据(不管现在单元格里实际存储数据的类型),所以对接的变量也应该具有任何类型。
(2)但是在下面示例中,又必须声明为具体的类型
需要 Dim arr() As String 。更好的解决办法,Dim arr ,将arr 声明为变体变量,对于声明为数组适用性更广。
(3)用For Each 循环中。For Each s In "集合",不管这个集合的数据具体是什么类型,变量s 都要是变体类型的。否则报"13"错。
2、 错误代码:91。描述:对象变量或With块变量未设置。原因(1)赋值时没写SET。将对象赋值给变量时,前面需写上Set 。
(2)引用了“空对象"。如:Dim sh1 as Worksheet sh1.range("A1")=0
Dim sh1 as Worksheet
sh1.range("A1")=0 '这里会报错,因为sh1还没被赋值,是个空对象
3、 错误代码:1004。描述:无具体说明。原因:向Excel发出了不能完成的指令。
例:Cells(i,1).value=0 如果i值为0,Excel根本没有0行,所以报错。要注意变量的值是否可能为0。
例2:
Sheets(1).Activate
Sheets(2).Range("B2")=10 '此句没有问题
Sheets(2).Range(Cells(1,1),Cells(3,3)).Value=9 '此句会报 1004 错。
//要写成 Sheets(2).Range(Sheets(2).Cells(1,1), Sheets(2).Cells(3,3)).Value=9
这是因为VBA会将Cells()单元格,认为是当前激活状态下工作表的Cells(),于是就产生了错误。
在跨工作表复制时,虽没报错,但常有这种混乱产生。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com