VBA-ZT第6节|VBA编程技巧与常见错误

最近更新:'2019-05-17'

1.错误类型
2.Err对象判断错误类型
3.加载项程序

1.错误类型

1.1案例1:数组与变体类型

VBA-ZT第6节|VBA编程技巧与常见错误_第1张图片

类型不匹配错误的常见原因:数组与变体类型


VBA-ZT第6节|VBA编程技巧与常见错误_第2张图片

出错的原因如下:

1.VBA无法确保Range的每一个单元格里面,存储的都是同一类型的数据。
2.将单元格内容一次性赋值给数组时,必须使用变体类型数组,即数组中每个元素都是变体。

更正方法如下:
把dim a() as string 更改为dim a()

VBA-ZT第6节|VBA编程技巧与常见错误_第3张图片

1.2案例2:数组与变体类型

VBA-ZT第6节|VBA编程技巧与常见错误_第4张图片

出错的原因如下:
与 Range不同,VBA可以确信 Split的拆分结果一定都是字符串。所以要求 Split的结果必须赋值给字符串类型的动态数组。
更正方法1如下:
把dim a()更改为dim a() as string
VBA-ZT第6节|VBA编程技巧与常见错误_第5张图片

更正方法2如下:
把dim a()更改为dim a
VBA-ZT第6节|VBA编程技巧与常见错误_第6张图片

注意事项:
变体数组 只是一个可以存放很多变体变量的 容器,它本身并 不是变体变量,所以 无法变化为字符串数组。

1.3案例3:数组与变体类型

VBA-ZT第6节|VBA编程技巧与常见错误_第7张图片
image.png

出错的原因如下:
For each循环中必须使用变体变量作为循环变量.

更正方法如下:

VBA-ZT第6节|VBA编程技巧与常见错误_第8张图片
image.png

1.4案例4:对象变量或with块变量未设置

VBA-ZT第6节|VBA编程技巧与常见错误_第9张图片

出错的原因如下:
1.为对象变量赋值时,忘记写“Set”
VBA-ZT第6节|VBA编程技巧与常见错误_第10张图片

2.试图引用“空对象”的属性或方法

VBA-ZT第6节|VBA编程技巧与常见错误_第11张图片

1.5案例5:视具体错误类型而变化

VBA-ZT第6节|VBA编程技巧与常见错误_第12张图片

出错的原因如下:
1.引用不存在的Excel元素

VBA-ZT第6节|VBA编程技巧与常见错误_第13张图片

2.尝试不可能发生的Excel用户操作

VBA-ZT第6节|VBA编程技巧与常见错误_第14张图片

3.使用了不可能存在的引用地址

VBA-ZT第6节|VBA编程技巧与常见错误_第15张图片

1.6调试错误的方法

单步-断点-监视器

2.Err对象判断错误类型

2.1方案1:用if语句进行分枝判断

VBA-ZT第6节|VBA编程技巧与常见错误_第16张图片

错误原因分析:

  • “-”不是数字,不能用于除法。所以提示“类型错误”。
  • 0做除数,计算结果为无穷大,所以提示“溢出错误”。

2.2方案2:On Error Resume Next

VBA-ZT第6节|VBA编程技巧与常见错误_第17张图片

错误原因分析:

  • On Error Resume Next 语句要求VBA忽略一切错误,继续运行。忽略一切错误,可能导致严重后果
  • 在使用On Error Resume Next时,如果在lf、While 等语句中的判断条件上发生错误,VBA仍然会忽略并进入If或While的内部继续执行。

良好的错误处理方式:
(1)能够区分出错误类型
(2)能够与核心功能代码分开书写

2.3方案3:On Error Goto 与Err

VBA-ZT第6节|VBA编程技巧与常见错误_第18张图片

案例分析:

  1. On Error GoTo somethingWrong:
    Cel1s(i,5)=Cells(i,4)/Cells(i,3)一旦出错,直接跳到标签后面(somethingWrong:)绕过了Exit Sub,不会结束程序。将用于错误处理的代码写于此处,与核心功能代码分离。

  2. somethingWrong:从VBA角度看,这一段只是位于Msgbox“全部完成!”后面的普通代码,仍需按照顺序正常执行。

  3. If Err.Number=13 Then
    如果最近一次错误的代码是13,则弹出消息框。

  4. ElseIf Err.Number=6 Then
    如果最近一次错误的代码是6,则弹出消息框。

  5. Resume
    每次执行完IF结构后,都跳转回出错的语句。

  6. Resume Next
    每次执行完IF结构后,都跳转到出错语句的下一行。


    VBA-ZT第6节|VBA编程技巧与常见错误_第19张图片
  7. Exit Sub
    程序一旦执行此句,就会自动跳出这个子过程,即结束运行。

知识拓展

  1. Err语句


    VBA-ZT第6节|VBA编程技巧与常见错误_第20张图片

Err.Number 代表最近一次错误的代码。如果从未发生错误,则Err.Number为0。

  1. Resume 语句:
    让程序跳转到刚刚发生错误语句上重新执行。

  2. 提示:遇到类似的“死循环”情况时,可以同时按下“Ctrl”和“Pause”键中断执行。

  3. Resume Next语句:
    让程序跳转到刚刚发生错误语句的下一行继续执行。

  4. On Error Goto 与Err作用:
    在发生错误时,直接跳转到指定标签后面的代码去执行。

  5. On Error Goto 0
    一旦执行本语句,后面所有代码再出错时,都恢复为VBA默认的错误处理方式(弹出错误提示并中断程序运行)

VBA-ZT第6节|VBA编程技巧与常见错误_第21张图片
  1. 健壮性(Robustness,鲁棒性)
    在遭遇输入、运算等异常时,能够处理错误并继续正常运行的能力

3.加载项程序

加载项让自己编写的VBA程序,能够在任何一个Excel文件中使用.

3.1加载函数

将普通VBA改成加载项的关键步骤

  1. 将ThisWorkbook的IsAddin属性设置为True
    ThisWorkbook属性查看:选中ThisWorkbook-视图-属性窗口
  2. 将该文件另存为.xlam或xla 类型。
    .xda/.xlam:专用于存放加载项(Add-In)代码的文件
    .xda可以适用于所有Excel版本;.xdam 只用于Excel2007以后版本,但是性能更高。

注意事项:

  1. 当一个工作薄的ThisWorkbook.IsAddin被设置为True以后,将无法在Excel窗口中看到任何工作表。
  2. 加载项文件的保存


    VBA-ZT第6节|VBA编程技巧与常见错误_第22张图片
  3. 第一次使用加载项之前,必须将其手动安装到Excel中
    开发工具-excel加载项


    VBA-ZT第6节|VBA编程技巧与常见错误_第23张图片
VBA-ZT第6节|VBA编程技巧与常见错误_第24张图片

3.2加载宏

怎样把子过程作为加载项?

与前面加载函数的步骤是一致的,唯一的区别是Excel不显示加载项中的宏名,你就需要在自定义栏增加一个宏的按钮,以此来运行自己的宏.

自定义栏增加一个宏的按钮步骤:

  1. 在workbook事件中,添加加载项
    添加AddinInstall事件代码,如下截图:


    VBA-ZT第6节|VBA编程技巧与常见错误_第25张图片

    VBA-ZT第6节|VBA编程技巧与常见错误_第26张图片
VBA-ZT第6节|VBA编程技巧与常见错误_第27张图片

这段代码的意思是第一次安装加载项的时候,excel会自动运行这段代码,这段代码的操作是会添加一个新的按钮,这个按钮的风格是一个标签按钮,显示出来的文字叫打招呼,一旦按下它就会自动执行模块1.sayhello

  1. 在workbook事件中,卸载加载项
    添加AddinUninstall事件代码,如下截图:


    VBA-ZT第6节|VBA编程技巧与常见错误_第28张图片

其他练习:自动倒计时

VBA-ZT第6节|VBA编程技巧与常见错误_第29张图片

知识拓展

  1. 自定义工具栏技术:
    编写VBA程序,修改Excel的工具栏、菜单等区域的内容。

你可能感兴趣的:(VBA-ZT第6节|VBA编程技巧与常见错误)