2.3 VBA代码编写规则
VBA是从VB中脱胎而来,其语言规范和VB6.0大致相同,它们的语法结构基本类似。VBA更适用于开发基于Office的应用程序,它有自身的代码编写规则,用户只有了解基本的特性,才能书写出能够容易理解的代码。
2.3.1 VBA语言书写规范
从结构上来看VBA代码,它是由一系列指令构成的,通常每一行构成一个指令。和我们通常书写文章类似,我们会在每一段开头需要空两个字作为新的段落的标志。从上节编写的简单程序就可以看出,书写VBA代码是有一定的惯例的。不过上节的代码过于简单,此处给出一段稍微复杂的代码,其作用是能够将1到100这100个整数填充到和当前活动单元格同列的各行内。在VBE中添加一个新模块,在工程资源管理器中双击该模块,显示该模块的代码窗口,在代码窗口中输入如下代码。
#001: Sub填充数据() #002: '这是一个测试程序 #003: Dim i As Integer #004: ActiveSheet.Cells.Clear #005: For i = 1 To 100 #006: ActiveCell.Offset(i -1, 0) = i #007: Next #008: MsgBox "测试完成!" #009: End Sub
注意
以后凡是描述Sub过程的代码都放置在模块中。在上述代码中使用了诸如“#001:”这样的内容,这是为了解释代码方便而加上的行号标志,而在实际代码窗口中输入的时候是不需要这些行号标志的。在实际代码窗口中输入的内容如图2-29所示。
图2-29 代码窗口输入内容
上述代码的第2行是一个用单引号引出的注释语句,第3行Dim后所跟随的内容就是变量的声明,“ActiveSheet.Cells.Clear”表示删除当前活动工作表中的内容。第5行到第7行使用了For……Next语句结构,表示的是一个循环结构。MsgBox给出的是一个消息框,通过消息框给操作者一个提示。
将鼠标在“Sub填充数据……End Sub”过程中任意一个位置单击,然后单击工具栏上的运行按钮,即可显示程序的运行结果。
1. 多行方式书写
从上述代码可以看出,执行的代码被书写在“Sub……End Sub”之间,除了注释语句外,这些代码应该都能被执行。一行结束以后需要按Enter键换行,表示另外一条指令的开始。
并不是所有的代码都像上述代码一样简短,在实际应用中会出现某些行的代码很长。为了便于代码阅读,需要将代码截断,将一行代码修改成多行显示。方法是在需要换行的位置处加一个空格和一条下画线“_”(英文输入法状态下同时按Shift键和减号键)。
例如下述代码的书写方式就是正确的。
MsgBox ThisWorkbook.Worksheets("sheet1").Cells(1, 1), _ vbOKCancel, "换行和不换行的效果比较"
2. 缩进处理
为了使得代码看上去更有层次,所以代码要进行缩进处理。一般来说过程、循环及判断过程中的代码都要进行缩进处理,以便和其他过程相区分。缩进处理的时候可以在行的开始处使用Tab键,每按一次Tab键就会缩进一次。还可以使用工具栏上的来调整是否缩进。
再次观察在本节的“Sub填充数据”过程中使用到的代码。第1行和第9行左侧是对齐的,而第2行比第1行代码缩进了一个Tab键的位置。至于For……Next循环中的第6行代码又分别比第5行和第7行代码缩进了一个Tab键的位置。
缩进处理是为了提高代码的可读性,实际上每行代码是否缩进,以及每行的开头缩进多少个单元格位置对代码实际执行效果是没有影响的。
2.3.2 添加注释
程序设计人员经常会遇到这样的情况,经过一段时间后发现看不懂自己原先设计的代码。例如为什么会设置某个变量,为什么会采用这样的设计思路等问题。这类问题的起因就很可能是因为没有为程序添加一个很好的注释。在代码中添加注释是一个好习惯,能够增加代码的可读性。
添加注释的代码将不被运行,为了防止某些代码对运行结果的干扰。在调试程序的时候可以将这些语句改为注释语句,而不需要从过程中删除这些语句。
添加注释的方法有如下3种:
● 使用单引号。
● 使用Rem关键字。
● 使用工具栏上设置注释块按钮。
1. 使用单引号
使用单引号作为注释的标志是最常用的方法,其使用方法就是在需要注释内容之前添加单引号。例如在本章开始处所给出的“Sub填充数据”过程中,第一行代码“'这是一个测试程序”就是注释语句,使用了单引号为代码添加注释。
如果单引号位于双引号内,则此时的单引号不表示引出注释。下述代码就表示了这样的一个过程。
#001: Sub测试() #002: '本行内容是注释MsgBox "该段代码是不可以执行的!" #003: MsgBox "该段代码可以执行,虽然有单引号'不表示注释!" #004: End Sub
将鼠标光标至于上述过程中,单击工具栏上的运行按钮,代码执行的结果如图2-30所示。
图2-30 执行结果
在上述代码中,第2行代码以单引号开头,表示该行为注释内容,在程序执行的时候不被执行。在第3行内容中,虽然也包含单引号,但是由于该单引号位于双引号内,表示正常的引用,不是注释开始的标志。
2. 使用Rem关键字
除了用单引号作为注释的符号外,还可以使用Rem关键字作为某行语句是注释语句的标志。例如将上例中的代码更改为如下的样式。
Sub使用Rem() Rem本行内容是注释MsgBox "该段代码是不可以执行的!" MsgBox "该段代码可以执行,虽然有单引号'不表示注释!" End Sub
Rem的使用方法和单引号不完全相同。单引号可以放置在一行的任意位置,既可以放置在一行的起始位置,也可以放置在一行中间位置,但是Rem却只能放在一行的起始位置,如图2-31所示的模块中的代码,就会产生一个错误。
图2-31 不能在一行中间位置使用Rem
3. 使用注释块
使用单引号或者Rem通常只是对一行进行注释。在调试程序时,为了屏蔽某些代码对运行结果的干扰,需要对连续多行内容添加注释,显然这样一行一行的添加单引号或者关键字就显得非常麻烦。简便的方法就是使用工具栏上的“设置注释块”按钮。利用VBE窗口中的编辑工具栏上的“设置注释块”功能一次性地将多行内容进行注释,具体操作方法如下。
(1)如果用户工具栏中没有显示编辑工具栏,可以在菜单栏或者是工具栏的空白处右击,在弹出的快捷菜单中选择“编辑”命令,完成向VBE窗口中添加“编辑工具栏”。
(2)在代码窗口中选中需要注释的内容,单击编辑工具栏上的“设置注释块”按钮,完成将指定的代码转化成注释块。
如果需要接触这些注释块,其操作方法是:在代码窗口中选中不再需要注释的内容,单击编辑工具栏上的“解除注释块”按钮,完成将指定的注释块还原成普通代码。
说明
设置注释块实际上就是由VBA自动地在每行的开始处自动添加一个单引号。解除注释块就是清除每行注释代码前的单引号。
2.3.3 With…End With
使用With…End With语句允许在某个指定的对象上进行多步的操作。
例2-06:在模块中有如下一段代码,描述了在当前工作表的A1单元格内输入文字“VBA测试”,并进行相应的格式设置,利用With…End With对这段代码进行精简。
Sub不使用With结构() ActiveSheet.Cells(1, 1).Select Selection.Font.Size = 12 Selection.Font.Bold = True Selection.Font.Italic = True Selection.Font.Underline = xlUnderlineStyleSingle End Sub
将光标定位在过程代码中,单击工具栏上的运行按钮,上述代码的运行效果是将A1单元格中的内容其字号会变成12号字,字体会以粗体、斜体和带细下画线的方式呈现。
观察上述代码,上述代码中有关将文字设置为粗体、斜体和下画线实际上都是对被选中单元格区域Selection进行的。对于这种同时针对某个指定对象进行的多步操作,可以用With…End With语句来进行简化输入。利用With…End With语句对上述代码进行修改。
Sub使用With结构() ActiveSheet.Cells(1, 1).Select With Selection .Font.Size = 12 .Font.Bold = True .Font.Italic = True .Font.Underline = xlUnderlineStyleSingle End With End Sub
这两段代码产生的效果完全一样,显然后一段代码的可读性要高于前一段代码。
说明
这个过程类似于数学中的提取同类项的功能。