第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 + GImmediate 窗口的输出信息会保留一定数量的历史记录,如果需要清除,只能手动清空示例: 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 语句

语法和功能:

表达式说明Do Loop无限循环,中间需插Exit Do,不然会死机Do While…Loop满足条件进入循环Do Until…Loop直到满足某个条件才退出循环 注:While或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