系统性的知识前面已经讲完,从本章开始,本系列教程涉及的将会是一些相对凌散的内容。

1. 注释

代码注释是一件利人利己的事,为了方便自己在代码需要更新修改时,依然能够快速地看懂自己完的每一行代码到底是什么意思有何用处,在关键点加上代码注释是很有必要的。如果要让别人也能看懂自己的代码,那么注释更是不可或缺的。

VBA中有两种注释的方法,其一是使用单引号,另一种是Rem。在单引号后面或Rem后面的所有内容,在程序运行时都不会被执行,它们就是注释的内容。通常注释的内容会被用其它颜色标识。如下:

有点不方便的是,貌似VBA里面并没有提供多行注释的方法,要想把多行代码注释掉,只能在每一行前面都加上单引号或者Rem

在程序写得比较长的时候,就有必要在其中加入注释。注释通常应使用于:

  • 逻辑复杂的地方
  • 调用自定义的函数或过程
  • 每个函数和过程的开头。描述本函数和过程的作用

还有其它一些作者认为应当写上注释的地方。每行都注释肯定是多余的,但不写注释,通常也是不对的。什么时候该写,什么时候不写,只有要自己用得多了之后,才会清楚。

2. 宏按钮

前面所讲的所有代码案例,都是在VBE里面执行的(无论是通过单击运行按钮还是快捷键F5),但这样明显是不方便的。一是每次都需要打开VBE甚至要定位到某一个过程中,才可以执行,二是如果不懂VBA操作的人,则完全不知该如何执行了。

在Excel菜单栏-开发工具中,找到“插入”,点击它可发现有“表单控件”和“ActiveX控件”,这里使用的是第一个,表单控件。它的第一个,就是按钮。点击一下这个按钮,则可以在Excel表格中通过鼠标的拖动来放置一个按钮对象。如果使用的是表单控件中的按钮,则在放开鼠标后,会马上弹出一个指定宏的对话框:

当然这时也可以不指定,点取消即可。后面有需要时,通过右键单击这个按钮,选择指定宏也可以达到同样的效果。

其实理论上来说,VBA中的过程,或者说Excel中的宏,可以指定给Excel中的各种对象实体,比如插入的图片、各种形状,甚至在Excel中的生成的图表,都是可以作为宏执行的载体的。

我通常都通过插入形状来设置按钮,因为形状更加美观,可以设置它的各种格式,和Excel表格配合更为协调,不影响整体版面。用如下方式插入一个自己喜欢的形状:

在其中加入提示文字并设置好格式后,就可以右键单击它,选择“指定宏”来把相应的VBA过程赋给它:

有兴趣的朋友,可以尝试学习使用ActiveX控件。通过鼠标拖放一个ActiveX控件后,右键单击它,查看代码,留意代码上方左右两个对象窗口,点击右边的下拉列表可以发现这个控件可以有很多事件,例如单击、双击、鼠标移入、鼠标移出、被选中时等

3. 错误处理

当代码执行出错时,VBA提供了两种处理的方式:

  • On Error GoTo
  • On Error Resume Next

3.1 On Error GoTo

表示如果自本行开始后面的代码执行出错,则跳至指定位置继续执行。如:

Sub te4()
On Error GoTo con
Debug.Print "a" + 3
Debug.Print 8 - 5
con:
Debug.Print "error occur"
End Sub

示例中第2行设置了On Error GoTo con,即当第3行出错时,就跳到con标记处,执行自con后的代码。标记后面应加上冒号(:)。第3行中,用双引号包含的a是一个字符串,而3是一个数字,直接将字符串与数字相加是会出错的,所以这里会触发错误,第4行不会被执行到,程序会直接跳转到con处,执行后面的Debug.Print语句。程序输出error occur。

注意,如果把第3行和第4行交换位置,则程序会先输出8-5的结果(即3),再输出error occur。

3.2 On Error Resume Next

表示如果代码执行出错,则从出错代码的下一行代码继续执行。如:

Sub te3()
On Error Resume Next
Debug.Print 5 + 3
Debug.Print "a" + 3
Debug.Print "error occur"
End Sub

代码第3行执行正常,第4行将出错,于是直接执行第5行。所以程序的输出是:

8

error occur

最后要提醒的是,以上提到的两种错误处理的方法应尽量尽量少用。因为有错误应该去解决它,而不是跳过它。

作业:

\1. 执行以下代码,观察输出结果,务必结合输出结果理解代码的每一行及它的逻辑。

Sub test()
On Error GoTo con
Debug.Print 3 + 3
Debug.Print 5 * 5 con:
Debug.Print "error occur"
Debug.Print "Do you understand this all?"
End Sub

\2. 执行以下代码,观察执行结果,务必结合输出结果以错误提示理解代码的每一行及整个代码的逻辑。

Sub test1()

    On Error GoTo con
On Error GoTo 0
Debug.Print 3 + 3
Debug.Print "c" - 3
Debug.Print 5 + 5
con:
Debug.Print "error occur"
Debug.Print "Do you understand this all?"
End Sub

本系列教程其它文章

Excel VBA 入门(零)

Excel VBA 入门(一)数据类型

Excel VBA 入门(二)数组和字典

Excel VBA 入门(三) 流程控制1-条件选择

Excel VBA 入门(四)流程控制2-循环控制

Excel VBA 入门(五)Excel对象操作

Excel VBA 入门(六)过程和函数

Excel VBA 入门(七)注释、宏按钮及错误处理

Excel VBA 入门(八)单元格边框

Excel VBA 入门(九)操作工作薄

Excel VBA 入门(十)用户窗体开发

Excel VBA入门(七)注释、宏按钮及错误处理的更多相关文章

  1. Excel VBA入门(九)操作工作薄

    虽然我前面讲过,在VBA中操作工作薄并不是件明智的事,但有些时候,还是避免不了要这么做.绝大多数情况下,我们要做的是获取到某个工作薄对象,并以此来获得其中的工作表对象,然后再对工作表中的数据进行处理. ...

  2. Excel VBA入门(八)单元格边框

    本文基于以下文件 http://pan.baidu.com/s/1nvJtsu9 (部分)内容预览: 1. 边框样式 Sub cell_format() Dim sht As Worksheet Di ...

  3. Excel VBA入门(六)过程和函数

    前面讲过,VBA代码有两种组织形式,一种就是过程(前面的示例中都在使用),另一种就是函数.其实过程和函数有很多相同之处,除了使用的关键字不同之外,还有不同的是: 函数有返回值,过程没有 函数可以在Ex ...

  4. Excel VBA入门(五)Excel对象操作

    本章是本系列教程的重点.但我觉得应该不是难点.从第零章开始到学完本章,应该可以把VBA用于实战中了. Excel对象主要有4个: 工作薄 Workbook 工作表 Worksheet 单元格区域 Ra ...

  5. Excel VBA入门(四)流程控制2-循环控制

    所谓循环控制,即在循环执行一段代码,用于完成一些重复性任务. VBA中的循环控制语句主要有3种:for.while.loop.对于大多数人来说,for的使用频率最高,而我个人也觉得for是最为灵活的, ...

  6. Excel VBA入门(三) 流程控制1-条件选择

    VBA中的流程控制分为两种,其一是条件结构式的,即根据条件判断的结果去选择性执行相应的语句(块):另一种是循环,即循环地执行语句(块).本节介绍第一种. 1. IF if 语句其实包含有几种形式: ① ...

  7. Excel VBA入门(一)数据类型

    与其它的编程语言一样,VBA也有它自己的数据类型.讲到数据类型,就离不开"变量"与"常量"这两个概念,变量与常量,都是用于保存数据的.顾名思义,"变量 ...

  8. Excel VBA入门(二)数组和字典

    数组和字典也是VBA的常用到数据类型之一.但是我翻了有四五本VBA教程相关的书,里面都没有介绍到字典,数组到是在介绍数据类型时有介绍,而并没有提到字典. 事实上,字典不是VBA内置的类型,它是Wind ...

  9. Excel VBA 入门(零)

    本教程所用系统环境: Windows 10 Excel 2013 1. 添加开发工具 打开Excel,依然找到"文件"->"选项"->"自 ...

随机推荐

  1. LeetCode String Compression

    原题链接在这里:https://leetcode.com/problems/string-compression/description/ 题目: Given an array of characte ...

  2. drone 学习三 条件步骤

    1. 基本格式 pipeline: slack: image: plugins/slack channel: dev + when: + branch: master 2. 几种条件类型 a. bra ...

  3. 坚持c++,真正掌握c++(4)

    这几天复习了c++primer的第12章类的解说,尽管之前这一章也看了几遍.可是我终究认为书读百遍其义自现,如今我给出一些我学习的心得,欢迎大家一起探讨. 首先,类能够说是c++的灵魂,正由于c++中 ...

  4. 在同一服务器使用git分支建立线上 和 测试 项目

    分支分配文件夹后 sourcetree 创建分支与合并 https://blog.csdn.net/qq_34975710/article/details/74469068 线上分支master 测试 ...

  5. MOSS 2013研究系列---修改默认Logo

    开发SharePoint2013 的时候,系统里面有一个“SharePoint” 的logo,客户很少不满意,我们的系统不能出现产品的名称,如下图: 咋么修改呢,咨询了广大网友,给出了一个解决方案: ...

  6. Unit02: JDBC核心API

    Unit02: JDBC核心API db.properties 注意:如果使用连接池,可以在这个文件中增加对连接池的相关设置: 连接池参数,常用参数有: 初始连接数 最大连接数 最小连接数 每次增加的 ...

  7. git clone 后使用子分支

    git clone 项目git地址 git branch -a 切换到子分支进行开发 git ckeckout 子分支名称,如:git checkout dev_feature_call git pu ...

  8. 微信APP支付整体流程记录备忘

      支付整体流程见文档:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=8_3   商户系统和微信支付系统主要交互说明:     步骤1: ...

  9. DjangoORM执行原生sql

    在Django中使用原生Sql主要有以下几种方式: 一:extra:结果集修改器,一种提供额外查询参数的机制 二:raw:执行原始sql并返回模型实例 三:直接执行自定义Sql   这种方式完全不依赖 ...

  10. 重载(overload),覆盖(override),隐藏(hide)的区别

    写正题之前,先给出几个关键字的中英文对照,重载(overload),覆盖(override),隐藏(hide).在早期的C++书籍中,可能翻译的人不熟悉专业用语(也不能怪他们,他们不是搞计算机编程的, ...