欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

程序员文章站 2022-07-03 18:25:52
...

 

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") 的值,也会报错

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

 

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!

暂时还不明白这个报错的机理

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

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")) 会造成这种报错
 

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

 

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内,不能定义在 外部

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

 

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)
  •  

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

 

 

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   当前范围内的声明重复

 

【原创】VBA学习笔记(8)VBA各种报错和原因备忘--丧心病狂小本子

 

 

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