因为数据引发的代码报错,这算是丧心病狂的报错吗?
例子
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") 的值,也会报错
今天因为一个EXCEL范围引用时的 冒号: 打错成 逗号 ; 后,报这个错误。
Rem 标点符号错误导致问题
Debug.Print WorksheetFunction.Sum(Range("a1;a10"))
Debug.Print WorksheetFunction.Sum(Sheets("sheet3").Range("a1;a10"))
Debug.Print WorksheetFunction.Sum(Range("a1;a10")) 会造成这种报错
原因分析
包括其他标点符号写错,都会有这种报错
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
Debug.Print WorksheetFunction.Sum(Sheets("sheet3").Range("a1;a10")) 会造成这种报错
如 application appliacation aplication等等!
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
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
这种问题一般都是因为用了工作表函数,遇到有错误数据时,健壮性不够
worksheetfunction.sum()
worksheetfunction.match()
一般来说
用application类下的函数就行
application.sum()
application.match()
Range(Range("w65536").End(xlUp).Row + 1) = "总计"
这种range(行号+1) 必然是语法错误,应该写成 range("v" & ()行号+1)) 才行
数组或区域的
1维数不对
2 边界情况的index不对
比如区域内arr的index最小得是1,而默认数组arr的index是0
出错的例子,这个原因是什么?
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
这个很可能是字典的后期绑定导致的问题
Rem Debug.Print dict_keys(0) 直接写就报错。??
原来前面要放个变量 如果加载scrrun.dll 可以不放变量 运行d.keys.(1)
http://club.excelhome.net/thread-890243-1-1.html
数组下标越界
引用了不存在的数组元素。
下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。
声明数组时没有指定元素的数目。
引用了不存在的集合成员。 试着使用 For Each...Next 结构代替指定元素下标。
使用速写形式的下标,结果指定了错误的元素。
下标越界不存在对应的工作薄、工作表名称是否写正确。
VBA的语法错误,VBE没有把第1个首字母大写就应该看出来 char(13) 是错误的
可能1 各种函数名,方法名,拼写错了,系统没有这个函数方法名,或者是自己也没自定义这个方法名。
可能2:宏和所使用的表的,位置不对,宏没有放在这个表里