【原创】VBA学习笔记(7)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

 

 

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不对

比如区域内arrindex最小得是1,而默认数组arrindex0

 

 

不能取得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)

http://club.excelhome.net/thread-890243-1-1.html

 

数组下标越界

 引用了不存在的数组元素。
  下标比可能下标范围大或小,或是在应用程序中这一边的数组没有指定范围。检查数组的声明以确认其上界和下界。若使用的是重新指定范围的数组,应使用 UBound 和 LBound 函数来决定数组访问。如果索引指定为变量,应检查变量名的拼写。
  声明数组时没有指定元素的数目。
  引用了不存在的集合成员。 试着使用 For Each...Next 结构代替指定元素下标。
使用速写形式的下标,结果指定了错误的元素。
  下标越界不存在对应的工作薄、工作表名称是否写正确。

 

 

语法错误,VBE的预览检查语法错误,虽然没报错,但是没有自动首字母大写就意味着有错误

VBA的语法错误,VBE没有把第1个首字母大写就应该看出来    char(13) 是错误的

 

 

 

 报错处理 VBA 未定义的子类

       可能1 各种函数名,方法名,拼写错了,系统没有这个函数方法名,或者是自己也没自定义这个方法名。

      可能2:宏和所使用的表的,位置不对,宏没有放在这个表里

 

 

对象变量 或 with 块变量未设置

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:精致技术 设计师:CSDN官方博客 返回首页
评论

打赏作者

奔跑的犀牛先生

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值