关于Procedure/过程
前面介绍了Module,是我们存放代码的单位,类似C语言的一个源文件。
而模块是由各种代码块构成的,有procedures和functions。
Procedures,有时也叫sub procedure,或者也可称为macro。
从代码层面,我们常使用procedure,而从excel的end user,即终端用户角度来看,可以看作Macro。
创一个模块,然后在里面创建一个procedure,可以叫做过程。这是一个beginning,开始我们的操作。
和创建模块的操作类似,激活模块的代码编辑窗口后,可以在菜单里选择insert a procedure,即插入一个过程。
第一步,the first step, give the procedure a name, 给你的过程起个名字,比如FunWithVBA。其他选项保持默认即可。
就创建了一个可运行的代码块,没有返回值,只是运行这里面我们编写的代码。
选项里的Scope是public,表示整个项目里都可以访问这个过程,项目就是整个Workbook,当前的Excel文件里的各个模块、各个sheet里的VBA代码都可以引用调用这个过程。
VBA里的procedures有三类,Sub、Function和Property。
关于VBA里的变量
前面介绍的都是VBA里的概念,下面说的是编程相关的概念,programming concepts。
第一个概念非常重要,就是variables,变量。
变量在任何语言中,都是非常基本的概念,并且也都是基本相同的概念。
在Excel VBA中,创建一个变量,start with dim keyword,这个是用来声明一个变量的保留字(the reserve key word to declare a variable)。
Public Sub MyPro()
dim userInput as string
userInput = "Georage"
activecell.Value = userInput
End Sub
使用变量的目的是什么?我们在编程中,需要从一些数据源中收集输入信息或数值,比如用户、别的Excel文件、自己的文档,或者要从其他数据源中导入数据。这些数据可能都有自己的形式或格式。要把这些其他数据源的数据,引入到我们的程序中,也就是这个过程里面。为了捕捉和存储这些数据,然后才能使用或留待备用,就要将这些数值存储在变量里。
比如上面代码,直接在程序编码时给变量赋值,也是一种用户输入的形式。
把编辑器窗口调整非全屏,并移动到屏幕右侧,准备运行程序。屏幕左边看到Excel的内容,右边可以一行行看VBA代码运行,这是了解VBA的好方式,也是debug VBA代码的好方法。
点击编辑器里,光标在此过程的代码中就OK。左边Excel点中一个单元格即可。
这时直接按下F8,就开始运行此过程,并进入调试模式。继续按下F8,就逐语句执行。可以光标移到变量上,看变量的值发生变化。运行完,Excel内的单元格内容就发生了变化。
也可以直接点击VBE上面工具栏的Play按键,来运行此过程。
下一个概念:循环 (Working Excel VBA Loops to repeat blocks of code)
每个编程语言里都会有这个关键(key)概念(concept):loops。
前面是一行行代码组成的代码块的执行,有时我们需要一些代码多次执行。
在VBA中有多种类型的循环,先介绍一种。
Public Sub FunWithVBA()
Do While ActiveCell.Value <> ""
ActiveCell.Font.Bold = True
ActiveCell.Offset(1, 0).Select
Loop
End Sub
上面代码演示的是do while循环,但这个do while和C语言的不一样,实际上是C语言里的while的loop功能。
这里判断当前单元格的值是否为空,如果不为空,就将字体设为粗体,并选定下一行同列的单元格。直到遇到空单元格,退出循环。
条件语句 - Building Logic with an IF Statement
前面讲了在过程中创建循环,下面介绍另一个概念,是VBA和其他编程语言中都有的逻辑控制语句。
上个例子整个一列有内容的都设置成了粗体,那如果我们有个判断条件,大于10的数字才设置成黑体呢?
Public Sub FunWithVBA()
Do While ActiveCell.Value <> ""
If ActiveCell.Value > 10 Then
ActiveCell.Font.Bold = True
ActiveCell.Interior.Color = RGB(0, 0, 255)
End If
ActiveCell.Offset(1, 0).Select
Loop
End Sub