1. 基本概念
1.1 为什么要学习VBA
自动化操作。我们在使用Excel的过程中,经常会有这样的情况,会按照相同的方法完成信息录入,表格格式调整,信息处理,表格保存等简单、重复操作。我们可以使用VBA将这些操作转换为VBA程序代码,使工作自动化。
成果复用。Office中的应用程序可以共享VBA语言,如果你掌握了Word中使用VBA的方法,那么在Excel、PPT中使用Excel将变得非常容易,可以减少大量不必要的重复性工作,提高工作效率。
易于掌握。VBA的语法简单,学习门槛低。对于没有编程基础的小伙伴,依然可以录制宏来记录用户的各种操作,Office将自动将宏转换为VBA代码,非常容易掌握。(还不知道如何录制宏的小伙伴,请点击下方链接)
功能强大。VBA可以调用Excel自带函数(数学与三角函数、日期与时间函数、查找与引用函数、逻辑函数、统计函数、文本函数、数据库函数),还可以自定义函数。VBA可以处理多种类型的数据,数值型、逻辑型等等。VBA支持处理工作簿、工作表、单元格等。
1.2 VBA究竟是什么
在介绍VBA之前,首先介绍VB。VB(Visual Basic)是Basic的第四代语言,是一种可视化、面向对象的结构化高级程序语言。
VBA与VB是什么关系呢?
VBA是VB的一个子集,VBA是VB与Office的结合。
VBA是新一代标准宏语言,VBA是Visual Basic for Applications的缩写,是在Office中执行通用的自动化任务的编程语言。VBA可以用于Word、Excel、PPT。
VBA与VB有什么区别呢?
- VBA的开发依赖于Office环境,VB具有自己的开发环境。
- VBA用于Office的自动化操作,VB是设计标准的Windows应用程序。
- VBA开发的程序依赖于它的父程序(Office),运行VB生成的应用程序是标准的可执行程序(*.exe),运行时不依赖开发环境。
2. 数据类型
我们在使用VBA程序时,首先需要学习VBA的数据类型。根据数据的用途、类型的不同,VBA的数据类型可以划分为三大类:
2.1 数值型数据
字节型数据(Byte):存储为1字节,数值范围是0到255,用于存放少量的整数值。
整数型数据(Integer):存储为2字节,数值范围是-32768到32767,用于表示整数,是经常被使用的数据类型。
长整型数据(Long):存储为4字节,数值范围是-2147483648到2147483647,用于表示大型数据。
单精度浮点型数据(Single):存储为4字节,表示单精度浮点值,表示的负数范围是 -3.4 E38 ~ -1.4E-45,正数范围是: 1.4E-45~ 3.4E38
双精度浮点型数据(Double):存储为8字节,表示双精度浮点值,表示的负数范围是-1.7E308 到-4.9E-324,正数范围是4.9E-324到1.7E308。
2.2 字符串型数据
固定长度字符串:长度范围是1~64000个字符,长度是固定的。
可变长度字符串:长度范围是0~20亿个字符,长度是不固定的。
2.3 其它数据类型
日期型数据(Date):8个字节,表示范围:100年1月1日 - 9999年12月31日
货币型数据(Currency):8个字节
布尔型数据(Boolean):2个表示,表示范围:True和False
据说聪明的人在学习知识时,最喜欢做的事情就是双击屏幕。
3. 常量和变量
常量和变量是VBA中非常重要的两个概念,在程序执行过程中,不会发生改变的数据被称为常量,用于存储固定信息。会发生改变的数据被称为变量,用于存储临时保存的值。
3.1 常量
在编写程序的过程中,有些数据值不会改变,并且会在多个地方被引用,我们可以将他们定义为常量。
我们分两个步骤来讲解:第一步是声明,第二步是使用。
按照如下的语法格式进行声明
Const <符号常量> = <常量值>
下面的示例中,第1行代码就是声明1个常量,第5行代码就是如何使用这个常量。
Const Rate=0.52
Dim Result As Double
Dim Original As Double
Original=100
Result = Original * Rate
3.2 变量
在程序执行过程中,某些数值会发生变化,这些临时数值被称为变量。变量包含名称和数据类型两部分,通过变量名称就可以引用变量。
在使用变量之前,我们需要声明变量。
Dim 变量名 [As 数据类型]
在上面的声明语句中,Dim和As被称为声明变量的关键字。这里的变量名命名方式尽量与实际功能相符合,方便记忆。这里的数据类型请参考本文第2章。
这里举两个例子,第1句声明一个数据类型是整型的变量,变量名是Length,第2句声明一个数据类型是字符串的变量,变量名是SName。
Dim Length As Integer
Dim SName As String
4. 运算符
VBA程序是由一个个表达式组成的,而表达式是由操作数和运算符组成,这里的操作数可以是我们第3章介绍过的变量,也可以是常量。而运算符包括算术运算符、赋值运算符、比较运算符、连接运算符和逻辑运算符。
本章将对这些运算符逐个进行讲解。
4.1 算术运算符
算术运算符包括7种:加法、减法、乘法、除法、整除、指数、求余。
算术运算符
4.2 赋值运算符
赋值运算符就是等号,赋值运算符可以给变量赋值,也可以给对象的属性赋值。例如:
Dim SName As String
SName = "Company"
4.3 比较运算符
比较运算符通常用于比较两个数值的大小,比较两个表达式的大小,比较运算符的输出结果是布尔型数据。布尔型数据包括True或False,如果比较结果是真,则为True,如果比较结果为假,则为False。
比较运算符
4.4 连接运算符
连接运算符包括两种:&和+。连接运算符属于二元运算符,即运算符包括两个变量。
连接符&:不管什么类型的数据,&都将左右的变量当成是字符串,并将这两个字符串进行连接。
连接符+:当参与连接运算的两个变量是字符串时,+号才完成字符串连接的作用,否则被当成加法运算符。
举例说明:
SName="Today"&"_Duty",输出结果:SName=Today_Duty
SSequence="300"+"_180",输出结果:SSequence=300_180
4.5 逻辑运算符
逻辑运算符用于执行表达式之间的逻辑操作,结果是布尔型数据。常用的逻辑运算符包括“逻辑与”、“逻辑或”,“逻辑非”,“逻辑异或”。
逻辑运算符
当您看到这里的时候,说明您距离掌握VBA基础知识只差最后一步了,那就是双击屏幕。
5. 程序结构
学过C语言的同学们都知道,在C语言中,具备三种类型的程序结构:顺序结构、分支结构和循环结构。在VBA中也是一样,使用这三种程序结构就可以实现我们的算法处理流程
5.1 顺序语句
顺序结构是最基本的语句,顺序结构就是按照程序中的语句顺序逐条依次执行,顺序结构包括两种语句:赋值语句和声明语句。
赋值语句和声明语句,我们已经在前面详细介绍了,这里不再赘述。
5.2 分支语句
在实际程序执行的过程中,语句的执行顺序可能根据某些条件语句来判断。常见的条件语句包括单分支IF语句结构、双分支IF语句结构、多分支IF语句结构、Case语句结构。
单分支IF语句结构
在单分支IF语句结构中,当IF表达式执行结果为True时,执行后面的语句组,当表达式执行结果为False时,则直接跳过后面的语句组,语句执行流程如下图所示。
单分支IF语句结构
在程序中,我们使用下面的语法格式。
IF <条件表达式> Then
<语句组1>
End IF
双分支IF语句结构
我们在实际应用场景中,可能会遇到这样的情况,当不满足条件时,我们也需要执行某些语句组。当满足条件表达式时,执行语句组1,当不满足条件表达式时,执行语句组2。
双分支IF语句结构
在程序中,我们使用下面的语法结构
IF <条件表达式> Then
<语句组1>
Else
<语句组2>
End IF
多分支IF语句结构
有时候我们的逻辑决策不是一条,而是多条,我们在程序执行过程中,需要完成逻辑决策树的梳理。
实际的逻辑决策树执行流程是这样的:
1)当满足条件表达式1时,执行语句组1,当不满足条件表达式1时,跳转到第2)句;
2)当满足条件表达式2时,执行语句组2,当不满足条件表达式2时,跳转到第3)句;
3)...
4)当满足条件表达式N时,执行语句组N,当不满足条件表达式N时,执行语句组N+1。
在程序中,我们使用下面的语法结构:
IF <条件表达式1> Then
<语句组1>
Else IF <条件表达式1> Then
<语句组1>
...
...
Else IF <条件表达式N> Then
<语句组N>
Else
<语句组N+1>
Else
Case语句结构
我们刚刚学习了使用IF语句实现多分支IF语句结构,学过C语言的同学都知道,使用Case语句也可以完成多分支语句结构。
实际的逻辑决策树执行流程是这样的:
1)当满足条件表达式1时,执行语句组1,当不满足条件表达式1时,跳转到第2)句;
2)当满足条件表达式2时,执行语句组2,当不满足条件表达式2时,跳转到第3)句;
3)...
4)当满足条件表达式N时,执行语句组N,当不满足条件表达式N时,执行语句组N+1。
Case语句结构
在程序中,我们使用下面的语法结构:
Select Case 测试表达式
Case <条件表达式1>
<语句组1>
Case <条件表达式2>
<语句组2>
...
...
Case <条件表达式N>
<语句组N>
Case Else
<语句组N+1>
End Select
5.3 循环语句
我们在实际的VBA应用程序中,可能会遇到反复多次处理的问题,我们可以将这些反复处理的语句提取出来,再用循环语句进行嵌套。
循环语句总共包括三类:For-Next语句、Do-Loop语句、While-Wend语句。其中For-Next语句用于循环次数已知的情况,Do-Loop语句和While-Wend用于循环循环次数未知的情况。
For-Next语句
在VBA中,For-Next语句的实际执行情况是这样的:
1)用初值给循环变量赋值;
2)判断循环变量是否超过终值,如果循环变量超过终值,则退出For循环,如果循环变量未超过终值,则执行第3)步;
3)执行循环体,循环变量=循环变量+步长。
用流程图进行描述如下:
For-Next循环
在程序正常执行的情况下,For-Next循环次数是确定的,循环次数= 终值-初值)/步长+1。
我们在程序中,是这样进行调用的:
For <循环变量> = <初值> To <终值> ( Step < 步长>)
<语句组1>
Next <循环变量>
Do-Loop语句
Do-Loop语句应用于循环次数未知的情况,主要包括4种循环语句:Do-While-Loop循环语句、Do-Until-Loop循环语句、Do-Loop-While循环语句、Do-Loop-Until循环语句。
(1)Do-While-Loop循环语句
程序实际执行流程是这样的:
1)先判断循环条件是否成立;
2)如果成立,则执行语句组1;
3)如果不成立,则跳出循环。
在调用程序语句时,结构是这样的:
Do While <循环条件>
[循环语句]
Loop
(2)Do-Until-Loop循环语句
程序实际执行流程是这样的:
1)先判断循环条件是否成立;
2)如果不成立,则执行语句组1;
3)如果成立,则跳出循环。
Do Until <循环条件>
[循环语句]
Loop
(3)Do-Loop-While循环语句
程序实际执行流程是这样的:
1)先执行循环体;
2)判断循环条件是否成立;
3)如果成立,则继续执行;
4)如果不成立,则跳出循环。
Do
[循环语句]
Loop While<循环条件>
(4)Do-Loop-Until循环语句
程序实际执行流程是这样的:
1)先执行循环体;
2)判断循环条件是否成立;
3)如果不成立,则继续执行;
4)如果成立,则跳出循环。
Do
[循环语句]
Loop Until<循环条件>
While-Wend语句
While-Wend语句同样适用于循环次数未知的情况。
程序实际执行流程是这样的:
1)先判断循环条件是否成立;
2)如果成立,则执行语句组1;
3)如果不成立,则跳出循环。
在调用程序语句时,结构是这样的:
While <循环条件>
[循环语句]
Loop