第2部分 常用语句
2.1 基础语句
2.1.1 定义子过程
- 语法:Sub SubName
End Sub
- 组成部分:SubName是自定义的过程名称,Sub用于声明子过程的开始,End Sub则标记子过程的结束
- 作用:在VBA中通常会将代码分解成小的、独立的功能单元,写在Sub子过程中,便于模块化管理、调用和维护
- 写入位置:
位置 写入代码 调用方式 作用范围 模块 函数、子过程和其他代码 可以直接调用 整个工作簿 WorkSheet 通常用于响应工作表事件,例如单元格值的更改、工作表的激活 工作表事件触发 当前工作表 ThisWorkbook 通常用于处理工作簿级别的事件,如工作簿的打开、关闭等 工作簿事件触发 整个工作簿 用户窗体UserForm 通常与该用户窗体相关联 用户交互触发 当前用户窗体 - 示例:工作簿打开事件;在ThisWorkbook中左边下拉选Workbook,右边下拉选Open
- 注意事项:在后面的练习中,除特殊情况,代码一般都写在标准模块里
2.1.2 调用子过程
- 直接调用:Call(可省略)+子过程名称
- 适用于:标准模块中的子过程
- 示例:
Call MySubroutine ' 显式调用名为 MySubroutine 的子过程
- 通过对象调用:对象.子过程名称
- 适用于:工作表和工作簿中写入的的通用的子过程
- 特别说明:工作表和工作簿中除了写入处理工作表或工作簿事件的代码,也可以写入通用的子过程,只是不常用;因为对于与工作表和工作簿无关的任务代码,写在其中会使代码变得难以维护和理解
- 示例:
ThisWorkbook.MyMacro ' 调用名为 MyMacro 的工作簿级宏 Sheet1.MySubroutine ' 调用名为 MySubroutine 的 Sheet1 工作表上的子过程
2.1.3 赋值语句
- 语法:赋值运算符“=” 或 Set
- 功能:用于给变量赋值
- 赋值方法:
- 数据类型:直接赋值,例如:
x = 10
将整数值10赋给变量x
- 对象类型:必须使用
Set
关键字,例如:Set ss = range("a1")将a1单元格赋给变量ss
判断变量是数据类型还是对象在【VBA学习笔记一 :变量】中,链接:https://blog.csdn.net/gogoel/article/details/137739474?spm=1001.2014.3001.5501
2.1.4 Debug.Print 语句
- 语法:Debug.Print expression
- expression:要输出的表达式,可以是文本、变量、函数的返回值等
- 功能:把需要的调试信息输出在Immediate 窗口,方便查看和测试
- Immediate 窗口位置:视图——立即窗口,快捷键为 Ctrl + G
- Immediate 窗口的输出信息会保留一定数量的历史记录,如果需要清除,只能手动清空
- 示例:
Sub test() Dim num As Integer num = 10 Debug.Print "The value of num is: " & num End Sub
2.2 条件语句
2.2.1 IF语句
- 语法:If...Then...ElseIf/Else(可省略)...End If
If 条件 Then
' 条件为真时执行的代码
ElseIf 条件 Then
' 上一个条件为假且当前条件为真时执行的代码
Else
' 所有条件均为假时执行的代码
End If
- 功能:用于根据条件执行不同的代码块
- 示例:先把x分别赋值为正数、负数和零, 消息框会出现不同的提示
If x > 0 Then
MsgBox "x 是正数"
ElseIf x = 0 Then
MsgBox "x 是零"
Else
MsgBox "x 是负数"
End If
- 省略
End If:
在VBA中,If 语句通常需要使用 End If 来标识语句块的结束。然而,有一种情况下可以省略 End If,那就是当 If 的条件和 Then对应的执行语句合并在同一行
If x > 0 Then MsgBox "x 是正数"
2.2.2 IF语句和函数配合使用
1)AND
函数:
- 语法:If...AND...Then...End If
- 功能:用于判断多个条件是否同时成立,只有当所有条件都为真时,才返回真(True)
2)OR
函数:
- 语法:If...OR...Then...End If
- 功能:用于判断多个条件中是否至少有一个条件成立,只要有一个条件为真,就返回True
3)NOT
函数:
- 语法:If Not...Then...End If
- 功能:用于对单个条件取反,当条件不成立时,就返回True
示例:
Sub CheckConditions()
Dim x As Integer
x = 10
' 如果 x 大于 5 并且小于 15,则显示消息框 "条件成立"
If x > 5 And x < 15 Then
MsgBox "条件成立"
End If
' 如果 x 小于 5 或者大于 15,则显示消息框 "条件成立"
If x < 5 Or x > 15 Then
MsgBox "条件成立"
End If
' 如果 x 不等于 5,则显示消息框 "条件成立"
If Not x = 5 Then
MsgBox "条件成立"
End If
End Sub
2.2.3 Select Case 语句
- 语法:Select Case...Case...Case Else(可省略)...End Select
Select Case expression Case value1 ' 当 expression 等于 value1 时执行的代码块 Case value2 ' 当 expression 等于 value2 时执行的代码块 Case Else ' 当 expression 不等于任何已经列出的 value 时执行的代码块 End Select
- 组成部分:
1)expression:必填,是一个表达式 ,通常是变量或者函数的返回值
2)Case子句:
语法 | 说明 |
Case value1, value2, ... | 匹配一个或者多个表达式/值 |
Case value To value2 | 匹配范围内的值(包括两端值),如果value为字符串, 取值范围为按字母顺序排列的 value 到 value2 的范围 |
Case 表达式 | 指定表达式的范围,可以与比较运算符或者like一起使用 例如:Is > MaxNumber为匹配大于最大值的数值 like "*apple*"为匹配包含apple的字符串 注:* 是通配符,表示任意数量的任意字符 |
- 功能:根据不同条件执行不同代码块
- 优点:比if语句更清晰地看到条件的取值范围
- 示例:
Sub TestStringAndNumber(value As Variant) Select Case value Case "apple", "banana" MsgBox "水果名称为 apple 或 banana" Case "N" To "S" MsgBox "字符串的首字母在N-S的范围内" Case Is > 10 MsgBox "数值大于 10" Case 6 To 8, 15 MsgBox "数值在 6 到 8 之间,或者为 15" Case Else MsgBox "其他情况" End Select End Sub Sub Demo() TestStringAndNumber "apple" ' 执行 Case "apple", "banana" TestStringAndNumber "OK" ' 执行 Case "N" To "S" TestStringAndNumber 5 ' 执行 Case Else TestStringAndNumber 12 ' 执行 Case Is > 10 TestStringAndNumber 7 ' 执行 Case 6 To 8, 15 End Sub
2.3 循环语句
2.3.1 For...Next 语句
- 语法:For counter = start To end [Step stepvalue]
Next counter
- 组成部分:
参数 说明 counter 计数器变量,用于迭代循环次数 start 循环开始的值 end 循环结束的值 stepvalue 可选参数,指定计数器变量每次增加的步长,可正可负,默认为 1 - 功能:按照指定的步长从起始值开始递增或递减执行循环,直到达到结束值
- 示例:让 i 从4循环到36,每次循环增加4
For i = 4 To 36 Step 4 MsgBox i Next i
注:Next i 中的i可以不写,但是循环嵌套的时候,写上可以清楚的看到这个next是第几层循环
2.3.2 For Each...Next 语句
- 语法:For Each element In group
Next element
- 组成部分:
参数 说明 element 循环变量,指集合中的每个元素 group 对象集合或者数组 - 变量声明element:
- 在使用
For Each
循环遍历数组时,循环变量element通常声明为Variant
类型,因为数组中的元素可以是任何类型的数据 - 在遍历对象集合时,循环变量element通常声明为集合中对象的具体类型或者
Object
类型
- 功能:用于遍历集合对象中的每个元素
- 示例:
Dim num As Variant, arr() As Variant arr = Array(1, 2, 3, 4, 5) For Each num In arr MsgBox num Next num
2.3.3 Do...Loop 语句
- 语法和功能:
注:While或Until也可以放在Loop的后面表达式 说明 Do Loop 无限循环,中间需插Exit Do,不然会死机 Do While…Loop 满足条件进入循环 Do Until…Loop 直到满足某个条件才退出循环 - 组成部分:
- While或Until后面加 condition,condition为循环的终止条件
- Exit Do:可选参数,用于提前退出循环
示例:
Sub TestDoLoops()
Dim i As Integer
i = 1
' Do While...Loop 循环
Do While i <= 5
MsgBox "Do While: " & i
i = i + 1
Loop
i = 1 ' 重置计数器
' Do Until...Loop 循环
Do Until i > 5
MsgBox "Do Until: " & i
i = i + 1
Loop
i = 1 ' 重置计数器
' Do...Loop While 循环
Do
MsgBox "Do...Loop While: " & i
i = i + 1
Loop While i <= 5
End Sub
2.4 流程控制语句
2.4.1 GoTo 语句
- 语法:GoTo label
label:
- 组成部分:label是自定义的标签,当指定条件发生时,会跳过中间部分直接运行到标签代码
- 功能:跳转,可以使程序在不同的条件下执行不同的代码块,或者在特定情况下跳出循环
- 注意事项:建议尽量避免过多使用GoTo语句,过度使用可能会导致代码难以理解和维护
- 示例:
Sub Example() Dim x As Integer x = InputBox("Enter a number:") If x > 10 Then GoTo GreaterThanTen ElseIf x < 10 Then GoTo LessThanTen Else GoTo EqualToTen End If GreaterThanTen: MsgBox "The number is greater than 10" Exit Sub LessThanTen: MsgBox "The number is less than 10" Exit Sub EqualToTen: MsgBox "The number is equal to 10" Exit Sub End Sub
2.4.2 Exit 语句
- 语法和功能:
语法 功能 Exit For 提前退出For循环 Exit Do 提前退出Do循环 Exit Sub 提前退出子过程 - 使用说明:
- Exit 语句通常跟在If 语句后面,在满足某个条件的情况下退出循环或者子过程
- 在使用Exit 时尽量让代码运行到想要的次数刚好退出,不要运行多余的部分
示例:当循环到达 5 时,用Exit For 提前退出循环
Sub ExampleExitFor() Dim i As Integer For i = 1 To 10 If i = 5 Then MsgBox "Reached 5, exiting the loop." Exit For ' 提前退出循环 End If ' 在此处执行其他操作 Next i End Sub
- 使用说明:
2.5 错误处理语句
2.5.1 On Error 语句
- 语法和功能:
表达式 | 说明 |
On Error Resume Next | 忽略错误并继续执行代码 |
On Error GoTo 0 | 用于错误处理完成后立即停止执行代码,恢复默认模式 |
On Error GoTo label | 发生错误时跳转到指定的标签处执行代码 |
2.5.2 Err 对象及其方法、属性
- 说明:用于访问代码运行错误时的报错信息,默认属性是Number
- 方法:
- Err.Clear:清除 Err 对象中的错误信息,使其恢复到无错误状态,以便程序可以继续执行后续的代码而不受之前错误的影响
- Err.Raise:手动引发一个错误,可以指定错误代码、错误描述和错误类型,使用方法:Err.Raise vbObjectError + 错误代码
- 属性:
属性 说明 Err.Number 错误代码,运行无误为0,用于识别不同的错误类型 Err.Description 错误描述,提供关于错误的详细信息 Err.Source 错误源,指示引发错误的对象 Err.HelpFile 提供关于错误的帮助信息,需要指定正确的帮助文件路径 Err.HelpContext 设置为帮助文件中与错误相关的上下文 - 示例:我们使用
InputBox
要求用户输入一个负数。如果用户输入的是非负数,则手动引发一个错误,错误代码为vbObjectError + 1000
,错误描述为 "输入的不是负数"。然后程序会进入错误处理部分,在其中显示错误信息,并清除错误信息以便程序继续执行
Sub TestErrRaise()
On Error GoTo ErrorHandler
' 模拟发生错误
Dim userInput As Integer
userInput = InputBox("请输入一个负数:")
If userInput >= 0 Then
' 如果用户输入的不是负数,则手动引发错误
Err.Raise vbObjectError + 1000, , "输入的不是负数"
Else
MsgBox "输入的是负数:" & userInput
End If
Exit Sub
ErrorHandler:
MsgBox "发生错误:" & Err.Number & vbCrLf & "错误描述:" & Err.Description
Err.Clear
End Sub
2.6 With语句
- 语法:With object
.+对 object 的操作1
.+对 object 的操作2
· ...
.+对 object 的操作n
End With
- 组成部分:object 是在VBA中要操作的对象,用with先指定要操作的对象,再通过点(也就是“.”)+具体的运行代码 对object进行操作
- 功能:简化对同一个对象的多个属性或方法的操作,避免重复输入
- 示例:通过 With 语句连续操作Sheet1的工作表名称和单元格的值
Sub TestWithStatement() Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") ' 使用 With 语句设置工作表的属性和操作其范围 With ws .Name = "NewName" ' Sheet1工作表重命名 .Cells(1, 1).Value = "Hello" ' 改变Sheet1单元格A1的值 .Cells(1, 2).Value = "World" ' 改变Sheet1单元格B1的值 ' 更多对工作表的操作 End With End Sub