文章目录
- 一、基本概念
- 二、语法
- 2.1 数据类型
- 2.11 基本数据类型
- 2.12 常量
- 2.13 数组
- 2.2 控制语句
- 2.21 条件语句
- 2.22 循环语句
- 2.23 错误处理:On Error
- 2.24 逻辑运算
- 2.3 其它语句
- 2.31 注释
- 2.32 with语句
- 2.4 表达式
- 2.41 常见表达式类型
- 2.42 表达式的优先级
- 2.5 VBA 的代码结构
- 三、VBA开发环境
- 四、VBA的内存管理
- 五、常用内置函数
- 六、VBA和宏
- =====================
跟很多面向过程的编程语言类似的。本文写的很简单,我基本不用VBA的。自己可以去微软看文档。
一、基本概念
VBA(Visual Basic for Applications)是一种由微软开发的编程语言,主要用于自动化操作和扩展Microsoft Office应用程序的功能。
它是Visual Basic编程语言的一个子集,能够让用户创建自定义的脚本、自动化任务、构建应用程序界面以及进行复杂的数据处理。VBA不仅局限于Excel,还可以用于Word、PowerPoint、Outlook等多种Microsoft Office应用程序。
还有一个东西叫
COM
,比如用C语言读写excel等。
VBA的基本特点:
-
集成性:VBA与Microsoft Office应用程序紧密集成,允许用户通过编程接口访问Office应用的对象模型,从而控制应用程序的各项功能。
-
易学易用: 相对于其他编程语言,VBA的语法相对简单,且与Visual Basic相似,对于初学者来说较为友好。
-
宏功能:VBA被广泛应用于Excel的宏录制中,用户可以通过录制操作生成VBA代码,并对其进行编辑和扩展。
-
跨平台支持 :VBA代码在Windows和Mac版的Office中都有支持,但在Mac版Office中的一些功能有所限制。
VBA的应用领域:
-
自动化重复性任务
利用VBA可以实现一些重复性任务的自动化,如在Excel中处理大量数据、生成报表、自动填充表单等。 -
自定义Excel函数
用户可以通过VBA编写自定义函数,在Excel中实现一些标准公式无法完成的任务。 -
创建用户界面
使用VBA可以创建表单和控件,如文本框、按钮、下拉菜单等,增强用户与Excel交互的体验。 -
数据处理和分析
通过VBA可以实现复杂的数据操作,如筛选、排序、数据转换、生成图表等。 -
Office应用集成
VBA不仅可以用于Excel,也可以与Word、Outlook、PowerPoint等其他Office应用程序集成,实现跨应用的数据操作和功能扩展。
二、语法
2.1 数据类型
2.11 基本数据类型
数据类型 | 描述 | 存储大小 | 取值范围/精度 |
---|---|---|---|
Byte | 存储0到255之间的整数 | 1 字节 | 0 到 255 |
Integer | 存储-32,768到32,767之间的整数 | 2 字节 | -32,768 到 32,767 |
Long | 存储-2,147,483,648到2,147,483,647之间的整数 | 4 字节 | -2,147,483,648 到 2,147,483,647 |
Single | 存储单精度浮点数,精度为7位有效数字 | 4 字节 | -3.402823E38 到 3.402823E38 |
Double | 存储双精度浮点数,精度为15位有效数字 | 8 字节 | -1.7976931348623157E308 到 1.7976931348623157E308 |
Currency | 存储货币类型数据,精度为4位小数 | 8 字节 | -922,337,203,685,477.5808 到 922,337,203,685,477.5807 |
Decimal | 存储高精度的十进制数 | 16 字节 | 范围较大,精度更高,用于需要高精度的小数计算 |
String | 存储文本数据,动态长度 | 动态 | 0 到 2GB(取决于内存和平台) |
Date | 存储日期和时间 | 8 字节 | 从公元100年1月1日到9999年12月31日,时间精度到秒 |
Boolean | 存储布尔值 | 2 字节 | True (1)或 False (0) |
Object | 存储对象的引用 | 4 字节(通常) | 适用于任何COM对象,如Excel、Word应用对象等 |
Variant | 存储任何类型的数据,类型动态分配 | 16 字节(通常) | 可以存储任意类型的数据,如Integer , String , Date 等 |
Any | 用于函数参数,允许传入任何类型的数据 | 根据类型 | 任何数据类型 |
User-defined Types (UDT) | 自定义数据类型,用于组合多个不同的数据类型 | 依据结构体大小 | 组合多个数据类型 |
数组 | 存储多个同类型的元素 | 动态/定长 | 数量及大小根据定义,数组元素类型相同 |
Enum | 定义一组命名常量值 | 4 字节(通常) | 可指定每个常量值,默认从1开始递增 |
补充说明:
- 定长字符串:
String * n
(例如:String * 10
)表示一个长度为n
的固定长度字符串。- 动态数组:数组大小可以通过
ReDim
动态调整。Variant
类型:可以存储任何类型的数据,并根据存储的内容动态转换,通常用于存储不确定类型的数据。
自定义类型相当于C语言的struct,例如:
Type 自定义类型名元素名 As 类型…[元素名 As 类型]
End Type
2.12 常量
常量是用于定义固定值的标识符,这些值在程序运行期间不能改变。
VBA支持不同类型的常量,常用的包括数字常量、字符串常量、布尔常量、以及用户定义常量。
在VBA中,常量通过Const
语句来声明,常量的值一旦设置就无法改变。
Const 常量名 As 数据类型 = 常量值
例如:
Const pi As Double = 3.14159
常量的类型与变量类似,可以是数值型、字符串型、布尔型等。
常量类型 | 示例定义 | 说明 |
---|---|---|
数值常量 | Const pi As Double = 3.14159 | 用于定义固定的数字值。 |
布尔常量 | Const isEnabled As Boolean = True | 用于定义固定的布尔值,通常是 True 或 False 。 |
字符串常量 | Const greeting As String = "Hello, World!" | 用于定义固定的字符串值。 |
日期常量 | Const startDate As Date = #1/1/2025# | 用于定义固定的日期值。 |
VBA还提供了许多预定义的内置常量,常用于特定的编程任务,例如与文件操作、错误处理、对象模型等相关的常量。以下是一些常见的内置常量:
常量名称 | 说明 |
---|---|
vbYes | 在消息框中表示“是”按钮的常量 |
vbNo | 在消息框中表示“否”按钮的常量 |
vbCancel | 在消息框中表示“取消”按钮的常量 |
vbOK | 在消息框中表示“确定”按钮的常量 |
vbCritical | 在消息框中显示“错误”图标 |
vbInformation | 在消息框中显示“信息”图标 |
vbExclamation | 在消息框中显示“警告”图标 |
vbDefaultButton1 | 表示消息框中第一个按钮是默认按钮 |
vbTab | 表示制表符,通常用于文本格式化 |
vbCrLf | 表示回车换行符(用于文本换行) |
vbObjectError | 用于自定义错误代码的常量 |
vbTrue | 布尔值常量,表示 True (逻辑真) |
vbFalse | 布尔值常量,表示 False (逻辑假) |
vbNull | 为空值,通常用于数据库操作,表示未设置或空值 |
VBA允许用户自定义常量,可以通过Const
语句为特定的应用场景定义常量。例如,定义一个表示每年365天的常量:
Const DaysInYear As Integer = 365
常量作用范围
- 常量的作用范围通常是其所在的模块。如果常量在一个子程序或函数内部声明,则其作用范围仅限于该子程序或函数。
- 如果常量在模块级别(模块的最顶端)声明,则它的作用范围是整个模块。若使用
Public
关键字,则常量在整个项目中可用。
例如:
' 在模块级别声明常量
Public Const MaxAttempts As Integer = 3
常量与变量的区别
特性 | 常量 | 变量 |
---|---|---|
值是否可变 | 不可变,一旦赋值后不能修改 | 可修改,程序运行时值可以改变 |
声明方式 | 使用 Const 关键字声明 | 使用 Dim 或 Private 等声明 |
存储位置 | 存储在内存中,且值是固定的 | 存储在内存中,值是动态的 |
常量的示例:
Sub TestConstants()' 数值常量Const Pi As Double = 3.14159Debug.Print Pi ' 输出:3.14159' 布尔常量Const IsActive As Boolean = TrueDebug.Print IsActive ' 输出:True' 字符串常量Const WelcomeMessage As String = "Welcome to VBA!"Debug.Print WelcomeMessage ' 输出:Welcome to VBA!' 日期常量Const StartDate As Date = #1/1/2025#Debug.Print StartDate ' 输出:1/1/2025' 使用内置常量If MsgBox("Do you want to continue?", vbYesNo + vbQuestion, "Confirm") = vbYes ThenDebug.Print "User clicked Yes"ElseDebug.Print "User clicked No"End If
End Sub
2.13 数组
数组是用来存储多个相同类型数据的一种数据结构。数组可以包含多个元素,每个元素通过索引访问。VBA支持定长数组(固定大小)和动态数组(大小可变)。
❄️数组可以使用Dim
语句声明,并且可以是定长数组或动态数组。
- 定长数组:定长数组的大小在声明时就被固定下来,不能改变。
Dim arr(5) As Integer ' 声明一个包含6个元素的整型数组,索引从0到5
- 动态数组:动态数组的大小可以在运行时通过
ReDim
语句动态调整。
Dim arr() As Integer ' 声明一个未指定大小的整型数组
ReDim arr(5) ' 运行时指定数组大小为6,索引从0到5
默认情况是下标从0开始,所以数组长度是最大索引+1,但是也可以设置下标从1开始,最大长度则和最大索引相同:
使用语句:Option Base 1
即可设置(默认是0)。
这会影响到你在整个模块中声明的数组
❄️数组的元素通过索引来访问,索引通常从0开始,也可以自定义起始索引。
Dim arr(5) As Integer
arr(0) = 10 ' 给第一个元素赋值
arr(1) = 20 ' 给第二个元素赋值
Debug.Print arr(0) ' 输出:10
Debug.Print arr(1) ' 输出:20
🧪 二维数组:
Dim arr(2, 3) As Integer ' 创建一个二维数组,3行4列
arr(0, 0) = 1
arr(1, 2) = 5
Debug.Print arr(1, 2) ' 输出:5
🧪三维数组:
Dim arr(2, 2, 2) As Integer ' 创建一个三维数组
arr(0, 0, 0) = 10
arr(1, 2, 2) = 20
Debug.Print arr(1, 2, 2) ' 输出:20
动态数组在声明时没有指定大小,可以通过ReDim
来调整数组的大小。ReDim
只能用于动态数组。
Dim arr() As Integer
ReDim arr(5) ' 数组大小为6,索引从0到5
arr(0) = 10
arr(5) = 50ReDim Preserve arr(10) ' 扩展数组的大小为11,且保留已有的数据
arr(10) = 100
- ReDim Preserve:使用
Preserve
关键字可以在调整数组大小时保留现有的元素数据,但只限于调整最后一个维度的大小。
ReDim Preserve arr(10) ' 调整数组大小并保留数据
删除动态数组:
Erase arr ' 释放动态数组的内存
🟢VBA数组的下标范围可以通过LBound
(获取数组的最小索引)和UBound
(获取数组的最大索引)来获取。对于多维数组,可以指定维度。
Dim arr(1 To 5) As Integer
Debug.Print LBound(arr) ' 输出:1
Debug.Print UBound(arr) ' 输出:5
对于多维数组:
Dim arr(1 To 3, 1 To 4) As Integer
Debug.Print LBound(arr, 1) ' 输出:1
Debug.Print UBound(arr, 1) ' 输出:3
Debug.Print LBound(arr, 2) ' 输出:1
Debug.Print UBound(arr, 2) ' 输出:4
VBA数组可以在声明时进行初始化,尤其是对于固定大小的数组。
Dim arr(3) As Integer
arr = Array(1, 2, 3, 4) ' 初始化数组元素
Array
函数可用于快速初始化数组,但它不适用于动态数组。
🟣 数组常见操作
-
复制数组:
通过Copy
方法可以复制数组,但需注意数组大小一致,或者使用ReDim Preserve
方法来扩展数组。Dim arr1(5) As Integer Dim arr2() As Integer arr1(0) = 10 arr1(1) = 20 arr2 = arr1 ' 将arr1的内容复制到arr2
-
数组排序:
如果需要对数组排序,可以使用VBA中的Sort
方法(如在Excel中对数据排序)或手动编写排序算法(如冒泡排序)。
2.2 控制语句
控制语句,用于根据不同的条件或循环执行不同的代码块。常见的控制语句包括 条件语句(如 If...Then...Else
)、选择语句(如 Select Case
)和 循环语句(如 For
, Do...Loop
)。以下是这些控制语句的详细介绍。
2.21 条件语句
❄️(1) If…Then…Else:用于根据条件的真假来执行不同的代码块。
If 条件 Then' 条件为True时执行的代码
Else' 条件为False时执行的代码
End If
示例:
Dim x As Integer
x = 10If x > 5 ThenDebug.Print "x大于5"
ElseDebug.Print "x小于或等于5"
End If
❄️(2) If…Then…ElseIf…Else:如果有多个条件需要判断,可以使用 ElseIf
。
If 条件1 Then' 条件1为True时执行的代码
ElseIf 条件2 Then' 条件2为True时执行的代码
Else' 如果条件1和条件2都不为True时执行的代码
End If
示例:
Dim x As Integer
x = 10If x > 15 ThenDebug.Print "x大于15"
ElseIf x > 5 ThenDebug.Print "x大于5但小于或等于15"
ElseDebug.Print "x小于或等于5"
End If
❄️(3) Select Case: 用于根据一个表达式的值选择多个可能的分支,比多个 If...ElseIf
更简洁。
Select Case 表达式Case 值1' 执行的代码块Case 值2' 执行的代码块Case Else' 所有值不匹配时执行的代码
End Select
示例:
Dim x As Integer
x = 3Select Case xCase 1Debug.Print "x等于1"Case 2Debug.Print "x等于2"Case 3Debug.Print "x等于3"Case ElseDebug.Print "x不是1、2或3"
End Select
2.22 循环语句
❄️(1)For…Next:用于重复执行某段代码,直到满足指定的条件。
For i = 初始值 To 终止值 [Step 步长]' 每次循环执行的代码
Next i
示例:
For i = 1 To 5Debug.Print "当前值是:" & i
Next i
❄️(2) For Each…Next:用于遍历集合或数组中的每个元素。
For Each 元素 In 集合或数组' 每次循环执行的代码
Next 元素
示例:
Dim arr(3) As Integer
arr(0) = 10
arr(1) = 20
arr(2) = 30For Each value In arrDebug.Print value
Next value
❄️(3)Do…Loop:用于在满足条件时重复执行某段代码。可以根据不同条件控制循环的开始、结束或退出方式。
Do While 条件' 条件为True时执行的代码
Loop
或者:
Do Until 条件' 条件为False时执行的代码
Loop
示例:
Dim i As Integer
i = 1Do While i <= 5Debug.Print "当前值是:" & ii = i + 1
Loop
❄️(4) Do…Loop While/Until
Do...Loop While
和 Do...Loop Until
循环在循环体内先执行代码,再检查循环条件。
Do' 执行的代码
Loop While 条件 ' 条件为True时继续循环
或者:
Do' 执行的代码
Loop Until 条件 ' 条件为True时退出循环
示例:
Dim i As Integer
i = 1DoDebug.Print "当前值是:" & ii = i + 1
Loop Until i > 5
❄️🗺️(5) Exit For/Exit Do
Exit For
和 Exit Do
用于提前退出循环,不再继续执行。
示例:
For i = 1 To 10If i = 5 ThenExit For ' 当i等于5时退出循环End IfDebug.Print i
Next i
🧪跳出本次循环:
- Exit For 用于跳出 For 或 For Each 循环。
- Exit Do 用于跳出 Do…Loop 循环。
举例:
For i = 1 To 10If i = 5 ThenExit For ' 当 i 等于 5 时,跳出整个 For 循环End IfDebug.Print "当前值是:" & i
Next i
2.23 错误处理:On Error
On Error
用于指定错误处理的方式。当运行时错误发生时,VBA 会根据 On Error
语句的指示进行相应的处理。
- On Error GoTo 错误标签:当发生错误时跳转到指定的标签。
- On Error Resume Next:发生错误时跳过错误的代码行,继续执行下一行代码。
- On Error GoTo 0:禁用错误处理,恢复默认行为(显示错误消息)。
示例:
Sub ErrorHandlingExample()On Error GoTo ErrorHandlerDim x As Integerx = 1 / 0 ' 除以零,会导致错误Exit SubErrorHandler:Debug.Print "发生错误:除以零"Resume Next ' 错误处理后继续执行下一行代码
End Sub
2.24 逻辑运算
在控制语句中,可以使用逻辑运算符来组合多个条件。
运算符 | 说明 |
---|---|
And | 如果两个条件都为True,则为True |
Or | 如果两个条件中至少有一个为True,则为True |
Not | 对条件取反 |
Like | 用于模式匹配 |
Is | 比较对象或数据类型 |
示例:
Dim x As Integer
Dim y As Integerx = 10
y = 20If x > 5 And y < 25 ThenDebug.Print "x大于5,且y小于25"
End If
2.3 其它语句
2.31 注释
(英文)单引号:
' 这是一个单行注释
Dim x As Integer ' 这是对代码行的注释
x = 10 ' 给变量x赋值为10
REM:
REM 这是一个单行注释
Dim x As Integer REM 这是对代码行的注释
x = 10 REM 给变量 x 赋值为 10
2.32 with语句
With...End With
语句用于简化对对象的多次引用,避免每次都写出对象名。可以在 With 块内直接引用对象的属性和方法。
Sub TestWith()Dim obj As ObjectSet obj = CreateObject("Scripting.FileSystemObject")With objDebug.Print .GetFile("C:\test.txt").NameDebug.Print .GetFile("C:\test.txt").SizeEnd With
End Sub
2.4 表达式
表达式 是由运算符、常量、变量、函数调用等组成的,表示一个值的计算过程。表达式的结果可以是一个数值、字符串、布尔值或对象等。
2.41 常见表达式类型
VBA 中的表达式可以分为以下几种常见类型:
❄️(1)算术表达式:算术表达式用于执行数学运算,例如加法、减法、乘法、除法等。
运算符:
+
加法-
减法*
乘法/
除法^
幂运算
Dim x As Integer
x = 5 + 3 * 2 ' 结果是11
❄️(2)字符串表达式:字符串表达式用于连接字符串或操作字符串。
运算符:
&
字符串连接
Dim str As String
str = "Hello, " & "World!" ' 结果是 "Hello, World!"
❄️(3)关系表达式:关系表达式用于比较两个值,并返回布尔值 (True
或 False
)。
运算符:
=
等于<>
不等于<
小于>
大于<=
小于等于>=
大于等于
Dim x As Integer
x = 5
If x > 3 ThenMsgBox "x 大于 3" ' 会弹出消息框
End If
❄️(4)逻辑表达式:逻辑表达式用于进行布尔值运算,通常用于控制结构中的条件判断。
运算符:
And
逻辑与Or
逻辑或Not
逻辑非
Dim x As Boolean
Dim y As Boolean
x = True
y = FalseIf x And Not y Then ' 结果是 TrueMsgBox "x 为真且 y 为假"
End If
❄️(5)位运算表达式:位运算用于对整数的二进制位进行操作。
运算符:
And
位与Or
位或Xor
位异或Not
位非<<
左移>>
右移
Dim x As Integer
Dim y As Integer
x = 5 ' 二进制:0101
y = 3 ' 二进制:0011
Debug.Print x And y ' 结果是1,二进制:0001
2.42 表达式的优先级
VBA 中的运算符优先级与其他大多数编程语言类似,常见的优先级如下(从高到低):
- 括号
()
^
幂运算*
、/
、\
(除法)、Mod
(取模)等算术运算符+
、-
(加法和减法)=、<>、<、>、<=、>=
(关系运算符)Not
(逻辑非)And
、Or
(逻辑运算符)
例如:
Dim result As Integer
result = 5 + 3 * 2 ' 结果是11,因为乘法的优先级高于加法
2.5 VBA 的代码结构
VBA的代码一般由以下几个部分组成:
-
模块
VBA代码通常在模块中书写,可以是标准模块、类模块或工作表模块。模块是VBA代码的基本单元。 -
子过程(Sub)
子过程是VBA中最常见的代码块,负责执行一系列操作。子过程没有返回值,通常通过Sub
关键字定义。例如:Sub GreetUser()MsgBox "Hello, world!" End Sub
-
函数(Function)
函数是用于计算并返回值的代码块。与子过程不同,函数会返回一个值,通常通过Function
关键字定义。例如:Function AddNumbers(x As Integer, y As Integer) As IntegerAddNumbers = x + y End Function
-
变量和数据类型
VBA支持多种数据类型,包括整数(Integer)、长整型(Long)、浮动数(Double)、字符串(String)、布尔型(Boolean)等。在VBA中声明变量时,可以使用Dim
关键字。例如:Dim num As Integer num = 10
-
控制结构
与其他编程语言一样,VBA也支持条件判断和循环等控制结构,如If...Then...Else
、For...Next
、Do...Loop
等。例如:If num > 5 ThenMsgBox "Greater than 5" ElseMsgBox "Less than or equal to 5" End If
三、VBA开发环境
VBA的开发环境是Microsoft Office应用程序内的VBA编辑器(VBE,Visual Basic Editor)。VBE可以通过按下 Alt + F11
打开,它提供了编写和调试VBA代码所需的所有功能。开发者可以在VBE中进行以下操作:
- 编写、调试和运行VBA代码。
- 通过对象浏览器(F2)查看Office应用程序的对象模型。
- 使用即时窗口(Ctrl + G)测试表达式和变量。
四、VBA的内存管理
VBA的内存管理相对简化,主要依赖于 VBA 运行时(VBE)和 Windows 操作系统的自动管理机制。
尽管 VBA 不提供像一些低级语言(如 C 或 C++)那样的显式内存管理工具(例如 malloc
或 free
),但它还是通过一系列内建的机制来管理内存使用。
🧪(1) 内存自动管理
VBA 的内存管理由 垃圾回收(Garbage Collection)机制和 自动内存分配与释放 控制。这意味着,开发者不需要显式地为变量分配和释放内存。内存的管理是自动进行的,运行时会处理变量的生命周期。
- 局部变量: 当局部变量的作用域结束时,它们所占用的内存会自动释放。这些局部变量通常是存储在栈内存中(stack memory)。
- 全局变量: 全局变量(模块级变量、静态变量)会在程序运行期间保持有效,直到程序结束时才会被释放。它们一般是存储在堆内存中(heap memory)。
🧪(2)对象的内存管理
VBA 使用 引用计数 来管理对象的内存(如 Excel 的 Range
对象、Workbook
对象等)。对象的内存分配和释放通常是由 VBA 的垃圾回收机制自动管理的。
-
引用计数: 当一个对象被创建时,VBA 会为它分配内存,并增加该对象的引用计数。每当一个变量或对象引用该对象时,引用计数就增加;当引用计数降为零时,该对象的内存会被自动释放。
例如:
Dim obj As Object Set obj = CreateObject("Excel.Application") ' 创建对象 Set obj = Nothing ' 解除引用,引用计数变为零,自动释放内存
尽管 VBA 自动管理内存,但在某些情况下,开发者需要明确地释放对象的引用,以确保内存尽早释放,尤其是当应用程序中有大量对象时。如果不手动设置对象为 Nothing
,对象可能会在程序运行期间占用不必要的内存。
例如,当你不再需要某个对象时,应该显式地将其设置为 Nothing
,这样可以清理内存:
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(1)
' 做一些操作
Set ws = Nothing ' 释放内存
🟠在 VBA 中,内存泄漏通常发生在以下几种情况:
- 对象引用未被正确释放(即没有将对象设置为
Nothing
)。 - 长时间运行的宏中创建了大量的对象,但未及时释放。
- 通过动态数组或
CreateObject
等方式创建的对象未释放。
为了避免内存泄漏,应当确保在不再使用对象时及时释放它们。
为了优化 VBA 程序的内存使用,可以采取以下措施:
- 尽量减少全局变量的使用,尤其是大型对象,这些变量会在整个程序的生命周期内保持有效。
- 在完成操作后及时释放对象引用,例如使用
Set obj = Nothing
来解除对象引用。 - 避免在循环中创建对象,如果在循环内每次都创建新对象,可能会导致内存压力增大。
- 避免过度使用动态数组,特别是在数组的大小不断变化的情况下。
五、常用内置函数
类别 | 函数名称 | 描述 |
---|---|---|
数学函数 | Abs | 返回绝对值 |
Sqr | 返回一个数的平方根 | |
Exp | 返回一个数的指数值 | |
Log | 返回一个数的自然对数 | |
Rnd | 返回一个介于 0 到 1 之间的随机数 | |
Int | 返回小于或等于给定数值的最大整数 | |
Fix | 返回小于或等于给定数值的整数部分 | |
Round | 四舍五入到指定的小数位数 | |
Cos | 返回一个角度的余弦值 | |
Sin | 返回一个角度的正弦值 | |
Tan | 返回一个角度的正切值 | |
字符串函数 | Len | 返回字符串的字符数 |
Mid | 从指定位置提取字符串的子串 | |
Left | 返回字符串的左边若干个字符 | |
Right | 返回字符串的右边若干个字符 | |
Trim | 去除字符串两端的空格 | |
LTrim | 去除字符串左侧的空格 | |
RTrim | 去除字符串右侧的空格 | |
InStr | 返回子串在字符串中首次出现的位置 | |
Replace | 替换字符串中的子串 | |
UCase | 将字符串转换为大写 | |
LCase | 将字符串转换为小写 | |
StrComp | 比较两个字符串并返回比较结果 | |
日期和时间函数 | Now | 返回当前的日期和时间 |
Date | 返回当前的日期 | |
Time | 返回当前的时间 | |
Year | 返回指定日期的年份 | |
Month | 返回指定日期的月份 | |
Day | 返回指定日期的天数 | |
Hour | 返回指定时间的小时数 | |
Minute | 返回指定时间的分钟数 | |
Second | 返回指定时间的秒数 | |
DateAdd | 在指定日期基础上添加时间间隔 | |
DateDiff | 返回两个日期之间的差异 | |
类型转换函数 | CInt | 将值转换为整数 |
CLng | 将值转换为长整数 | |
CDbl | 将值转换为双精度浮动点数 | |
CStr | 将值转换为字符串 | |
CDate | 将值转换为日期值 | |
CBool | 将值转换为布尔值 | |
数组函数 | UBound | 返回数组的最大下标 |
LBound | 返回数组的最小下标 | |
输入输出函数 | InputBox | 显示一个输入框,允许用户输入数据 |
MsgBox | 显示一个消息框,用于显示信息 | |
文件和路径函数 | Dir | 返回文件或文件夹的名称 |
FileLen | 返回文件的长度 | |
MkDir | 创建一个新的文件夹 | |
RmDir | 删除一个文件夹 | |
错误处理函数 | Err | 返回当前的错误号 |
Err.Description | 返回当前错误的描述 | |
集合和对象函数 | IsObject | 判断是否为对象 |
数学常量和常用常量 | Pi | 数学常量 π |
vbTrue | 布尔值 True | |
vbFalse | 布尔值 False |
示例:
-
Len
用法:Dim str As String str = "Hello, World!" MsgBox Len(str) ' 结果是 13
-
DateAdd
用法:Dim newDate As Date newDate = DateAdd("d", 5, Now) ' 当前日期加上5天 MsgBox newDate
-
Round
用法:Dim roundedValue As Double roundedValue = Round(3.14159, 2) ' 四舍五入到小数点后2位,结果是 3.14 MsgBox roundedValue
-
UCase
用法:Dim upperCaseStr As String upperCaseStr = UCase("hello") ' 转换为大写,结果是 "HELLO" MsgBox upperCaseStr
六、VBA和宏
宏和 VBA 并不是完全一样的概念,虽然它们在很多情况下紧密相关。
-
宏(Macro)
宏是一个可以自动化任务的程序,通常是由一系列的命令和操作组成。宏的主要目的是通过记录和执行用户的操作来自动化重复性任务。宏在很多应用程序中都有使用,尤其是在 Microsoft Office 软件(如 Excel、Word)中。- 定义:宏通常指的是在 Office 应用中自动执行一组预先定义的操作(如格式化表格、输入数据等)。
- 录制宏:在 Excel 等应用中,可以使用 宏录制器来录制用户在界面上的操作,然后将这些操作保存为宏。录制的宏本质上是 VBA 代码。
- 功能:宏常用于自动化用户的鼠标操作、菜单选择等,例如,在 Excel 中创建一个宏,记录填充一列数据的过程,后续可以通过运行该宏来自动完成。
-
VBA(Visual Basic for Applications)
VBA 是微软为 Office 应用提供的嵌入式编程语言。VBA 是一个完整的编程语言,支持面向过程的编程,可以编写复杂的逻辑、函数、类和对象等。- 定义:VBA 是一种嵌入在 Microsoft Office 应用程序中的编程语言,它允许用户编写脚本来自动化任务、创建用户定义的函数、进行更复杂的数据处理等。
- 编程:通过 VBA 编辑器(VBE)编写代码来实现自动化。VBA 代码可以比宏录制器生成的代码更灵活,可以进行更复杂的控制和操作。
- 功能:VBA 能够实现复杂的任务,超越简单的宏功能,例如与其他 Office 应用(如 Outlook、Access)进行交互、创建用户界面、处理数据库等。
-
宏与 VBA 的关系
- 宏录制和 VBA 代码:当你在 Excel 等 Office 应用中录制宏时,实际上是通过 VBA 编写了一段代码。录制的宏可以在 VBA 编辑器中查看和编辑,它会生成对应的 VBA 代码。例如,Excel 中录制的宏可能会生成如下代码:
- 简单和复杂功能:宏录制通常适用于简单、重复性的任务,而 VBA 则可以用来编写复杂的逻辑、控制流程、实现更高级的功能。
Sub Macro1()Range("A1").SelectActiveCell.FormulaR1C1 = "Hello"
End Sub
这段代码就是 VBA 编写的宏,可以进一步修改和扩展。
对比:
特性 | 宏 | VBA |
---|---|---|
定义 | 自动化一组简单的操作 | 嵌入式编程语言,用于更复杂的自动化和定制任务 |
录制方式 | 可以通过录制器录制用户的操作 | 手动编写代码 |
灵活性 | 通常用于简单的任务 | 支持复杂的编程逻辑和控制结构 |
功能 | 适合重复性、常规的自动化任务 | 可以实现更高层次的自动化和应用功能 |
代码复杂性 | 代码简单,通常无法修改复杂逻辑 | 支持面向过程的编程,代码可以灵活扩展 |
操作平台 | 主要用于 Office 应用 | 嵌入在 Microsoft Office 中,支持多种任务 |
=====================
VBA是VB的子集,宏是VBA的一种应用形式。