【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子
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 自动化错误的解决办法
http://club.excelhome.net/thread-1270827-1-1.html
https://zhidao.baidu.com/question/2201903842158113148.html
http://www.excelpx.com/thread-290493-1-1.html
http://club.excelhome.net/thread-1400268-1-1.html
出错的例子,这个原因是什么?
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