一、常见的数据类型与声明方法
数据类型就是对同一类数据的统称,如整数、日期、字符串等。
VBA里的数据类型有字节型(Byte)、整数型(Integer)、长整数型(Long)、单精度浮点型(Single)、双精度浮点型(Double)、货币型(Currency)、小数型(Decimal)、字符串型(String)、日期型(Date)、布尔型(Boolean)等。详见下表所示:
VBA变量声明
1. 强制显式声明
优势
- 事先定义了变量类型,会家坎代码运行速度。
- 增加代码可读性。
- 预防变量名称拼写错误。
2. 隐式声明
优势
方便
劣势
- 未知的变量类型,会自动地分配Variant数据类型,降低代码运行速度。
- 可能会导致变量拼写错误,从而浪费很多时间来排查故障。
3. 声明变量的方法
使用关键字Dim,在关键字Dim后面是变量名称,接着是数据类型。
示例
分别给学生的姓名、年龄、出生日期声明一个变量。表达式分别为。
每个变量分开换行独立声明:
Dim stuName as String
Dim stuAge as Integer
Dim BirthDate as Date
在一行内同时声明多个变量:
Dim stuName as String, stuAge as Integer, BirthDate as Date
二、对象、属性、方法、事件
1. 最主要的四个对象
- Application(Excel应用程序)
- Workbook(工作簿)
- Worksheet(工作表)
- Range(单元格)
2.对象的常用属性
3. 对象的常用方法
4. 事件
事件就是由用户或者系统出发的,可以在脚本中响应的一段代码。移动鼠标、打开工作簿、激活工作表、选中单元格、单机按钮或窗体、敲击键盘灯都会产生事件。
利用工作簿对象的默认事件Open方法,可以让Excel打开的时候自动问好。因为是默认事件,但打开工作簿时,这个事件就被激活。操作步骤如下:
- 按住键盘alt+F11组合键,打开“工程职院管理器”对话框,选择工作簿对象“Thisworkbook”;
- 在代码对话框中单击“对象框”下拉箭头,冲下拉列表中选择“Workbook”。工作簿的默认事件是Open,在代码框中会出现“Private Sub Workbook_Open()”和“End Sub”。在中间插入VBA代码“MsgBox "您好,欢迎你来到Excel的世界,我将带你飞上极乐世界!”
- 将写好代码的工作簿另存为Excel启用宏的工作簿(.Xlsm)文件格式。关闭此工作簿,下次重新打开此工作簿就自动弹窗出来。如下所示:
三、关系运算符与逻辑运算符
VBA语法需要条件表达式来进行判断返回结果,分别如下所示:
四、逻辑判断语句
如果需要根据负荷 的条件进行判断并返回相对应的结果,此时,就需要用到逻辑判断语句。
1. If…Then语句
根据条件表达式进行判断返回结果最简单的If…Then语句。语法表达式为:
If 条件 Then语句
例如,单元格A1里面的学生成绩大于等于60分, 就评定为“及格”:
If Range("a1") >= 60 Then MsgBox "及格"
如果条件为真,需要返回多个结果的时候,可以使用多行If…Then语句,语法表达式为:
If 条件 Then
语句1
语句2
...
End If
例如,单元格A1里面的学生成绩大于等于60分,就评定为“及格”且弹窗“恭喜你”,代码如下:
If Range("a1") >= 60 Then
MsgBox "及格"
MsgBox "恭喜你"
End If
2. If…Then…Else语句
当单个条件或多个条件为真的时候返回一个结果,否则返回另外一个结果。它有单行和多行两种表达。
- 单行表达式语法为:
If 条件 Then 语句1 Else 语句2
例如,单元格A1里面的学生成绩大于等于60分,评定为“及格”,否则评定为“不及格”。代码如下:
If Range("a1") >= 60 Then MsgBox "及格" Else Msg "不及格"
- 多行格式的If…Then…Else,方便阅读,同时,要以End If关键字结束。多行表达式语法为:
If 条件 Then
语句1
Else
语句2
End If
例如,单元格A1里面的学生成绩大于等于60分,评定为“及格”,否则评定为“不及格”。代码如下:
If Range("a1") >= 60 Then
MsgBox "及格"
Else
MsgBox "不及格"
End If
3. If…Then…ElseIf…Then…Else…End If语句
如需多个条件判断的情况,可以通过添加ElseIf关键字来实现功能。它可以执行多个判断语句,语法表达式为:
If 条件1 Then
语句1
ElseIf 条件2 Then
语句2
...
ElseIf 条件N Then
语句N
Else
语句N+1
End If
例如,单元格A1里面的学生成绩大于等于60分,评定为“及格”,成绩大于等于70分,评定为“良好”,成绩大于85分,评定为“优秀”,否则评定为“不及格”。代码如下:
If Range("a1") >= 85 Then
MsgBox "优秀"
ElseIf Range("a1") >= 70 Then
MsgBox "良好"
ElseIf Range("a1") .=60 Then
MsgBox "及格"
Else
MsgBox "不及格"
End If
4. Select Case语句
有时候If嵌套语句不是很好理解,可以利用Select Case语句替代,多个判断条件是在Select Case 和End Select关键字之间实现,关键字Is可以省略。如下:
Select Case 测试表达式
Case [Is] 表达式1
语句1
Case [Is] 表达式2
语句2
Case [Is] 表达式N
语句N
Case Else
语句N+1
End Select
同样,对单元格A1里面的学生成绩大于等于60分,评定为“及格”,成绩大于等于70分,评定为“良好”,成绩大于85分,评定为“优秀”,否则评定为“不及格”。代码如下:
Select Case Rnage("a1")
Case Is >= 85
MsgBox "优秀"
Case Is >= 70
MsgBox "良好"
Case Is >=60
MsgBox "及格"
Case Else
MsgBox "不及格"
End Select
五、循环判断语句
1. For…Next语句
如需重复运行某段语句,可以使用For…Next语句。语法表达式为:
For 循环变量 = 初值 To 终值 [Step 步长]
语句1
[exit for]
语句2
Next[循环变量]
方括号里面的语法是可以省略的。循环变量可以从初值到终值,按照step步长进行递增或者递减。
例如,统计并输出数值1+2+3…+100之和,代码如下:
Dim i%,sumt&
For i = 1 To 100
sumt = sumt+i
Next
MsgBox"1到100的和为:"&sumt
也可以写成如下样式:
Dim i%, sumt&
For i = 100 To 1 Step -1
sumt =sumt+i
Next
MsgBox "1到100的和为:"&sumt
如果语句里面有多个变量出现变化时,可以在For…Next循环语句里面嵌套多层For…Next循环语句。此外,循环体里面需要进行逻辑判断的时候,可以结合If…Then语句执行,语法表达式为:
For 循环变量1 = 初值 To 终值 [Step 步长]
For 循环变量2 = 初值 To 终值 [Step 步长]
If 条件 Then
语句
End If
Next [循环变量1]
Next [循环变量2]
例如,统计区域A1:D10之间大于等于60的数值个数,代码如下:
Dim i%, j%,count%
For i = 1 To 10
For j = 1 To 4
If Cells(i,j) >= 60 Then
count = count +1
End If
Next
Next
MsgBox "大于等于60的数值有"&count&"个!"
定义的变量i和变量j分别用来对单元格区域的行和列进行循环,变量count用来对符合条件的数值个数进行统计。变量i、j及count都定义为整型,变量无赋值的情况,初始值都默认为0。
2. For Each…Next语句
当过程需要在一个集合的额所有对象或者一个数组的所有元素之间循环时,应该使用For Each…Next循环,语法表达式为:
For Each 元素变量 In 对象集合或数组
语句1
[Exit For]
语句2
Next [元素变量]
例如,读取所有工作表的名字存储在第一个工作表的第一列,代码如下:
Dim i%, sht As Worksheet
i = 1
For Each sht In Worksheets
Sheets(1).Cells(i,1) = shit .Name
i = i +1
Next
首先定义i整型变量和工作表对象sht,变量i用来控制单元格的行号,sht对象用来循环指代工作表集合里面的每一个工作表。
3. Do…While语句
Do…While是VBA语法里面的一种循环语句。当判断条件为True的时候,可以一直循环,否则结束循环。它有两种语法表达式:
- 一种是在顶部进行条件判断,语法表达式为:
- 另一种是在底部进行条件判断。
顶部条件判断的语法表示为:
Do While 条件
语句块1
[Exit Do]
语句块2
Loop
例如,统计并输出数值1到100之间的奇数之和,代码如下:
Dim sumt&, i%
i = 1
i = Do While i <= 100
sumt = sumt+i
i = i+2
Loop
MsgBox "1到100之间的奇数之和为:“&sumt
如果循环条件放在底部运行时,循环体里面的语句至少执行一次。另外,但Exit Do语句执行时,循环便立即停止,底部条件判断的语法表达式如下:
Do
语句块1
[Exit For]
语句块2
Loop While 条件
例如,循环输入一个10-20之间的数值,直至输入的数值等于15的时候才会退出循环,代码如下:
Dim num%
Do
num = IinputBox("请输入一个10到20之间的数值:","提示!")
If num = 15 Then Exit Do
Loop While num <> 15
4. Do…Until语句
Do…Until也是一种循环语句,它可以重复循环语句直到条件为真。和Do…While语句类似,它也有两种语法表达式:
- 一种在顶部进行条件判断
- 一种在底部进行条件判断
顶部条件判断的语法表达式如下:
Do Until 条件
语句块1
[Exit Do]
语句块2
Loop
例如,统计并输出1到100之间能被3整除的数值之和,代码如下:
Dim sumt&, i%
i = 0
Do Until i >100
sumt = sumt+i
i = i+3
Loop
MsgBox "1到100之间的能被3整数的数值之和为:"&sumt
和Do…While语句一样,如果循环条件放在底部运行时,循环体里面的语句至少执行一次。另外,但Exit Do语句执行时,循环便立即停止,底部条件判断的语法表达式如下:
Do
语句块1
[Exit Do]
语句块2
Loop Until 条件
例如,读取所有工作表的名字存储在第一个工作表的第一列,代码如下:
Dim num%,i%
num = Sheets.count '获取所有工作表的个数
i = 1
Do
Sheets(1).Cells(i,1) = Sheets(i).Name
i = i +1
Loop Until i >num