0 报错经验的查询
- 报错,发生在报错的那一行
- 报错,也经常发生在报错的前一行
- 所以debug 要重点看,报错行和报错行的下一行!
报错,也经常发生在报错的前一行的例子
- 下面这个报错,其实是fn2=dir(fn) 引起的,应该写成fn2=dir(fp)
1 数据错误:如果有时候代码报错,先看看数据是不是有问题
因为VBA代码(函数,公式)涉及的数据,如果有问题也会报错
因为数据引发的代码报错,这算是丧心病狂的报错吗?
例子
range("a;a").specialcells(xlcelltypeformulas,16).select
如果范围内,没有报错单元格,会公式报错
例子
excel公式的vlookup 查询数据记得加false ,而且注意数据源的那几列/行,不要有其他数据污染了。否则一样会出莫名BUG
vlookup("",a:d,2,false)
例子
Sub 查找()
Range("H3") = Application.WorksheetFunction.VLookup(Range("I9"), Sheet3.Range("A3:B132"), 2, 0)
End Sub
如果无法在 Sheet3.Range("A3:B132") 的第1列里查找到 Range("I9") 的值,也会报错
2 语法错误,比如:写成了; 一个逗号引发的血案
运行错误1004(很可能是符号错误,基础语法错误)
今天因为一个EXCEL范围引用时的 冒号: 打错成 逗号 ; 后,报这个错误。
Rem 标点符号错误导致问题
Debug.Print WorksheetFunction.Sum(Range("a1;a10"))
Debug.Print WorksheetFunction.Sum(Sheets("sheet3").Range("a1;a10"))
2.1 VBA方法'range'作用于对象'_global'时失败
Debug.Print WorksheetFunction.Sum(Range("a1;a10")) 会造成这种报错
原因分析
- 错误原因1 可能只是语法错误,这里不应该是; 而是:MsgBox Application.Sum(Range("a1;c3"))
- 错误原因2: range(i,j) 这张错误语法也不行
- 错误原因3:比较复杂,可以百度
包括其他标点符号写错,都会有这种报错
Debug.Print WorksheetFunction.Sum(Range("sheet3!:a1:a10")) 注意这里sheet3!: 应该为sheet3!
暂时还不明白这个报错的机理
Sub test1001()
' Application.Sum (Range("sheet3!a1;a3"))
'Debug.Print Application.Sum(Range("a1;a3"))
Debug.Print Application.Sum(Range("a1:a10"))
End Sub
2.2 应用程序定义或对象定义错误
Debug.Print WorksheetFunction.Sum(Sheets("sheet3").Range("a1;a10")) 会造成这种报错
2.3 函数名,关键字 拼写错误也会有很多问题
如 application appliacation aplication等等!
3 明确语句返回的是对象还是变量!
如果是对象,需要要加到方法/属性层
3.1 举例语法:比如这2个语句返回的都是对象,所以后面如果不带方法/属性,就会报错
- [b1].Item(10, 3).select
- Cells(1,1).entireRow.select
3.2 报错举例
- 报错编译错误,语法错误 [b1].Item(10, 3)
- 属性的使用无效 Range("c3").EntireRow
4 变量定义只能在sub function内,不能定义在 外部
5 某些对象的方法,有特定的限制,方法参数错误会导致报错
- cells(3,3).delete
- 不带参数时,默认参数先是 xlup,如果下方无内容,则默认参数为xltoleft
- 或者指定参数
- cells(3,3).delete(xlup )
- cells(3,3).delete(xltoleft )
- 但是下面2种写法是错误的
- cells(3,3).delete shift:xldown 或者 cells(3,3).delete(xldown )
- cells(3,3).delete shift:xltoright 或者 cells(3,3).delete(xltoright)
6 关于 二义性错误
- 可能是 模块/脚本 内不同地方的变量同名了,但没声明过,比如2个sub中
- 甚至可能是多个EXCEL打开时,里面的变量重复
- 一个更准确的解决办法 在自定义类型前加 模块名,就不会重名了~
- Dim A As MDL_UTIL.myType
Rem 不同函数和过程里的参数名相同,在VBA里经常报二义性
Rem 所以尽量用不同名字的参数,比如 main1里别用a,b了,而用x,y
Sub test1(ByRef a) '参数默认是按ref调用
Debug.Print "test1被调用"
Debug.Print "a=" & a
a = 1
Debug.Print "a=" & a
End Sub
Sub test2(ByVal b)
Debug.Print "test2被调用"
Debug.Print "b=" & b
b = 2
Debug.Print "b=" & b
End Sub
Sub main1()
Debug.Print "执行main1"
Debug.Print "x=" & x
Debug.Print "y=" & y
x = 3
y = 4
Debug.Print "x=" & x
Debug.Print "y=" & y
Debug.Print "开始调用"
test1 x
test2 y
Debug.Print "调用结束"
Debug.Print "x=" & x
Debug.Print "y=" & y
End Sub
7 当前范围内的声明重复
8 自动化错误的解决办法
自动化错误-Excel VBA程序开发-ExcelHome技术论坛 -
vba小程序报"自动化(Automation)错误如何处理?_百度知道
http://www.excelpx.com/thread-290493-1-1.html
运行时错误'-2147286917(8003007b)': 自动化(Automation)错误 ,求解决-Excel VBA程序开发-ExcelHome技术论坛 -
9VBA有时候报错不准,需要关闭VBE再开
- 比如报错行,错了,
- 比如报错的 错误号 错误
10 报错:不能取得类 worksheetfunction的sum属性
这种问题一般都是因为用了工作表函数,遇到有错误数据时,健壮性不够
worksheetfunction.sum()
worksheetfunction.match()
一般来说
用application类下的函数就行
application.sum()
application.match()
11 报错 方法 range作用于对象_global时失败
Range(Range("w65536").End(xlUp).Row + 1) = "总计"
这种range(行号+1) 必然是语法错误,应该写成 range("v" & ()行号+1)) 才行
下表越界问题
数组或区域的
1维数不对
2 边界情况的index不对
比如区域内arr的index最小得是1,而默认数组arr的index是0
不能取得match属性
- Application.Match() 找不到匹配的内容,但不会报错,只会返回错误值
- WorksheetFunction.Match() 找不到匹配的内容,会直接报错跳出
出错的例子,这个原因是什么?
Rem 接下来想试验几个 从其他表读表名? 会报告数据源链接更新的问题
Sub t3()
Application.DisplayAlerts = False '消除警告
Dim wb As Workbook
Dim sh As Worksheet
Dim i As Integer
i = 1
Set wb = Workbooks.Open("C:\VBA\100.xls")
For Each sh In wb.Worksheets 'for each worksheet in wb 不行,变量不要用保留字 也不能 in wb
Do While wb.Sheets("create").Cells(i, 1) <> ""
If sh.Name = wb.Sheets("create").Cells(i, 1) Then
sh.Delete
End If
i = i + 1
Loop
Next
Application.DisplayAlerts = True '重开警告
End Sub
这个很可能是字典的后期绑定导致的问题
为什么报错:property let 过程未定义
Rem Debug.Print dict_keys(0) 直接写就报错。??
原来前面要放个变量 如果加载scrrun.dll 可以不放变量 运行d.keys.(1)
字典 d.keys() 出现property let未定义-Excel VBA程序开发-ExcelHome技术论坛 -
数组下标越界
引用了不存在的数组元素。
下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。
声明数组时没有指定元素的数目。
引用了不存在的集合成员。 试着使用 For Each...Next 结构代替指定元素下标。
使用速写形式的下标,结果指定了错误的元素。
下标越界不存在对应的工作薄、工作表名称是否写正确。
语法错误,VBE的预览检查语法错误,虽然没报错,但是没有自动首字母大写就意味着有错误
VBA的语法错误,VBE没有把第1个首字母大写就应该看出来 char(13) 是错误的
报错处理 VBA 未定义的子类
可能1 各种函数名,方法名,拼写错了,系统没有这个函数方法名,或者是自己也没自定义这个方法名。
可能2:宏和所使用的表的,位置不对,宏没有放在这个表里