VBA 是内置于 Microsoft Office 的编程语言,核心价值是实现办公自动化和功能定制化。
核心功能
-
任务自动化:自动执行重复操作(如数据处理、报表生成、邮件收发)
-
功能定制化:创建自定义函数、公式和命令,扩展 Office 原生功能,满足特定需求
-
应用交互性:打通 Excel、Word、PPT 等应用,实现数据与流程的自动交互和集成
-
界面个性化:开发专业窗体与对话框,为工具打造友好界面,降低使用门槛
绝对引用与相对引用的组合
绝对引用:选中第一行
相对引用:后续相对操作
在代码层级实现
录制宏后,记得恢复原状,避免后续使用宏时发生错误(执行宏后,不可撤销),或者在复制表格上录制
删除整行后,自动上移:删除操作从下向上做;if做判断
在第三行选择插入,故新的行在第三行
Sub 宏1() '开始宏
' 单行注释
' 宏1 宏
'
Rows("1:1").Select
' 定义 i 的数据类型
Dim i As Integer
'执行循环
For i = 1 To 100 Step 1 'Step默认为1
'IF函数控制结束循环
IF Range("b" & i)="" Then
EXIT for
Endif
'IF函数过程控制
If Range("b" & i) = "1" Then
Range("c" & i) = "true"
ElseIf Range("b" & i) = "0" Then
Range("c" & i) = "false"
Else
Range("b" & i) = "unknown"
End If
Next
End Sub '结束宏
有哪些操作可以执行 Select Add Delete Copy
有哪些信息可以获取 Count Name
'Sheet1.Select '选中sheet1
'Sheets("1月").Select '选中名为“一月的表”
'Sheets(1).Select '选中第一张表
'Sheets.Add '当前表前面新增一张表
'Sheets.Add after:=Sheet3, Count:=3 'sheet3后添加3张表:1、2、3、6、5、4
'Sheet3.Range("a1") = 1
'Range("a1") = Sheets.Count '赋值
'Sheets.Add after:=Sheets(Sheets.Count), Count:=3 '依次在最后添加3张表:1、2、3、4、5、6
'Sheet1.Name = "1"
'Dim i As Integer
'For i = 1 To 12
' Sheets.Add after:=Sheets(Sheets.Count)
' Sheets(Sheets.Count).Name = i & "月"
'Next
'Excel.Application.DisplayAlerts = False
'Sheets.Add Count:=100
'For i = 1 To 90
'Sheets(1).Delete
'Next
'Excel.Application.DisplayAlerts = ture
Sheets(1).Copy after:=Sheets(Sheets.Count)
Sub q() Dim i As Integer For i = 1 To 31 Sheet1.Copy after:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = “5月” & i & “日” Sheets(Sheets.Count).Range(“e5”) = “2016-5-“ & i Next End Sub
Dim i As Integer
For i = 2 To Sheets.Count Sheets(1).Range(“a” & i) = Sheets(i).Name
Next
Workbooks工作簿对象 For Each循环
Sub q()
Dim ge As Range Dim i As Integer For Each ge In Range(“a1:a10”) i = i + 1 ge = i Next End Sub
长按住esc,取消代码运行
Sub q() Dim rt As Worksheet
Application.DisplayAlerts = False
For Each rt In Sheets
If rt.Name <> “绝不能删” Then rt.Delete End If
Next
Application.DisplayAlerts = True
End Sub
Sub q() Dim rt As Range For Each rt In Range(“a1:a22”) If rt = “” Then rt.EntireRow.Delete End If
Next
End Sub 两行删不尽
Sub q()
‘Application.ScreenUpdating = False ‘Workbooks.Open Filename:=”H:\Onedrive\桌面\vba.xlsx” ‘ActiveWorkbook.Sheets(1).Range(“a1”) = “hello 89” ‘ActiveWorkbook.Save ‘ActiveWorkbook.Close ‘Application.ScreenUpdating = True
Workbooks.Add ActiveWorkbook.Sheets(1).Range(“a1”) = “123” ActiveWorkbook.SaveAs Filename:=”H:\Onedrive\桌面\vba2.xlsx” ActiveWorkbook.Close End Sub
点击顺序
sheets(1).select sheets(1).range(“a1”).select
执行对象:现在工作表、选中的工作表
range的默认值为value,但是
未声明情况(dim q as integer) 不能直接赋值
当作参数时,不能直接代入[ sheets( range (“a1”) ) ]
Sub q()
‘[a1].Select ‘Cells(10, 1).Select ‘Range(“a1”).Select Range(“a1”).Offset(10, 0).Select End Sub
Sub q() Dim rt As Range
For Each rt In Range(“b2:b20”) If rt.Offset(0, -1) = “男” Then rt = “先生” Else rt = “女士” End If
Next
End Sub
Sub q() Dim rt As Range
For Each rt In Range(“b2:b” & Range(“a65536”).End(xlUp).Row) If rt.Offset(0, -1) = “男” Then rt = “先生” Else rt = “女士” End If
Next
End Sub
Range(“a1”).EntireRow.Delete Range(“a10”).Resize(5, 10).Select
merge合并
clearcontents 清空内容 delete 删除
call q ‘调用宏q
autofilter 自动筛选
msgboc””
inputbox””
基本原理
Excel 是一个对象,这个对象包含很多属性和子对象,而 VBA 是可以操作这些对象的工具,实现各种各样的效果。例如,Excel 包括 Range 对象,即单元格对象,使用 VBA 可以改变单元格对象的填充颜色属性。用代码表示如下。
'A1 单元格的填充颜色设置为颜色号为 49407 的颜色
Range("A1").Interior.Color = 49407
上面的代码现在不懂没关系,在这里使用代码简单的演示一下 Excel 中的对象和 VBA 的关系。
- Range(“A1”)、Interior、Color 等是 Excel 具备的对象和属性;
- 对象和属性的操作,是通过 VBA 语言实现的,即上面是一行 VBA 代码。中间的等号(=)是 VBA 语言的赋值符号,也是能改变单元格填充颜色的关键所在。
以上就是 Excel VBA 的基本原理。下面从 VBA 语言层面和 Excel 对象层面,分别介绍相关基本概念。
VBA 语言中基本概念
注释
VBA 中的注释以英文单引号 (‘) 开头
变量
在程序开始,可以声明一个变量,指定变量的类型(数字、文本、逻辑值等),并给变量赋值。
以下方代码为例,
'声明一个文本类型的变量
Dim s As String
'给 s 变量赋值,即 "Hello World"
s = "Hello World"
'在 A1 单元格写入 s 变量存储的数据
Range("A1").Value = s
程序结构
程序结构表示程序的运行方式。VBA 正是因为存在多种代码结构,才能实现各类复杂的数据计算。常用的代码结构以下三种:
- 顺序结构
- 条件结构
- 循环结构
顺序结构,顾名思义,程序按照顺序执行。在 VBA 中就是从上到下,一行一行地执行。
条件结构,代码中的指定部分,按照某个条件,选择性地执行。即,条件为真时,执行指定代码;否则跳过该部分代码,不执行。
循环结构,代码中的指定部分,按指定次数,循环执行。这是为什么 VBA 的效率高的一个原因,因为它能将相同的操作,自动按任意数量重复执行。
关于程序结构的内容,在「程序结构」一章中详细介绍。
过程和函数
过程或函数包含多行代码,是组织代码的两种方式。一般情况下,一个过程或函数只包含实现一个功能的相关代码。如果一个过程或函数实现多个功能,建议将代码分成多个过程或函数。
过程和函数都可以执行一段代码,主要区别是,执行完代码后,函数能返回一个值,而过程不能返回。
数组
数组表示一组同类型的数据的集合,是 VBA 中最重要的概念之一。以下面的代码为例:
'创建数组
Dim s(1 to 4) As String
'给数组的元素赋值
s(1) = "Excel"
s(2) = "Word"
s(3) = "PowerPoint"
s(4) = "Outlook"
上述代码创建了一个长度为4个、类型为文本的一个数组。对数组,使用编号给相应位置进行赋值。
在 VBA 的实际应用中,经常需要将单元格的数据转换为数组进行处理。更多内容在「数组」章节介绍。
对象
对象包含描述静态信息的属性和对对象可以操作的方法。
以生活中的对象为例子,汽车是一个对象。汽车的车牌号、油量、里程等是汽车的属性;开车、加油、换车牌等是汽车的方法。
Excel VBA 中的基本概念
常用 Excel 对象
- Application 对象,表示 Excel 应用程序。
- Workbook 对象,表示工作簿对象。
- Worksheet 对象,表示工作表对象
- Range 对象,表示单元格区域对象。
模块
模块是包含一个或多个过程或函数的内部组件。一个工作簿内包含的模块数量没有限制,一个模块内包含的过程或函数数量也没有限制。模块用来作为保存过程或函数的容器,这些过程和函数通常应用于整个工作簿。
通过把多个过程和函数,合理的放置在不同的模块,可以使整个 VBA 代码逻辑更清晰、更易于阅读和理解。
用户窗体
用户窗体是 VBA 代码与使用者交互的用户界面。Excel VBA 提供很多基本的窗体控件,可以制作复杂的用户界面。最典型的,Excel 中设置单元格格式的窗口界面,就是一个用户窗体。
最基本的窗体控件包括:
- 文本控件
- 按钮控件
- 列表控件
- 输入控件
其他基本概念
VBA 编辑器
VBA 编辑器是 Excel 中写 VBA 代码的地方。编辑器中可以进行下列操作:
- 编写代码
- 修改已有的代码
- 插入新的模块,编辑模块中的代码
- 插入用户窗体,设计窗体界面
- 运行代码
- 调试代码
运算符
赋值运算符
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 给变量赋值 | name = “Zhang San” |
算术运算符
VBA 中完整的算术运算符如下
假设 a = 10,b = 3,-> 表示结果。
| 运算符 | 说明 | 示例 |
|---|---|---|
| + | 两数相加 | a + b -> 13 |
| - | 两数相减 | a - b -> 7 |
| * | 两数相乘 | a * b -> 30 |
| / | 两数相除 | a / b -> 3.33… |
| \ | 两数相除,取整数部分 | a \ b -> 3 |
| Mod | 两数相除,取余数 | a Mod b -> 1 |
| ^ | 幂运算 | a ^ b -> 1000 |
| -(取负) | 对数字取负 | -a -> -10 |
比较运算符
比较运算符,比较提供的两个变量,如果符合比较条件,返回 True,否则,返回 False。
假设 a = 10,b = 3,-> 表示结果。
| 运算符 | 说明 | 示例 |
|---|---|---|
| = | 比较两个值是否相等 | a = b -> False |
| > | 大于 | a > b -> True |
| >= | 大于等于 | a >= b -> True |
| < | 小于 | a < b -> False |
| <= | 小于等于 | a <= b -> False |
| <> | 不等于 | a <> b -> True |
逻辑运算符
逻辑运算符对逻辑值,即 True 和 False,进行逻辑运算,返回运算结果,运算结果也是逻辑值。
假设 a = True,b = False,-> 表示结果。
| 运算符 | 说明 | 示例 |
|---|---|---|
| And | 逻辑与,两个表达式都是真,返回 True。 | a And b -> False |
| Or | 逻辑或,两个表达式至少有一个为真,返回 True。 | a Or b -> True |
| Not | 逻辑否,对逻辑表达式取否 | Not a -> False |
| Xor | 逻辑异或,如果两个表达式不相同,返回 True | a Xor b -> True |
连接操作符
VBA 中的连接运算符用于连接 2 个或多个文本。其用法与 Excel 公式中的 & 符号相同。
| 运算符 | 说明 | 示例 |
|---|---|---|
| & | 连接两个文本 | “Zhang” & “ “ & “San” -> “Zhang San” |
其他操作符
| 运算符 | 说明 |
|---|---|
| _ (下划线) | 将一行代码分解成两行 |
| : ( 英文冒号) | 将两行代码放置在一行 |
文本类型
文本类型可以说是最常用的数据类型。实际中,几乎所有的数据均是文本类型
| 类型 | 说明 | 数据范围 |
|---|---|---|
| String | 文本类型 | 0 至 20亿字符 |
首先,声明一个文本类型变量,String是类型标识符,语法如下:
Dim name As String
VBA 中,文本需使用英文双引号表示。
name = "Zhang San"
如果把数字两端加上双引号,它会变成文本类型,不再表示数字
name = "101"
可以使用单元格内的文本,给文本类型变量赋值。
name = Range("A1")
声明变量
声明变量的语句,必须写在使用它的语句前。
VBA 中声明变量,有 4 种变量,它们是:
- 基本类型变量。基本类型变量是那些存储单个数据的变量,例如数字、文本、日期等。
- 通用变量。通用变量,即 Variant 类型变量。该变量的类型在程序运行过程中,根据赋值的数据自动指定。
- 数组。数组包含多个变量的集合。
- 对象。对象包含一些列属性和方法。
声明语句的基本语法
4 种类型的变量的声明方法基本一致。他们的语法如下。
1.基本类型变量
'语法
Dim [变量名] As [数据类型]
'实例
Dim name As String
Dim age As Integer
Dim height As Double
Dim birthday As Date
2.通用变量
声明 Variant 类型变量时,如果忽略数据类型,默认情况是 Variant 类型,因此下方两种方式是相同的。
'语法
Dim [变量名] As Variant
Dim [变量名]
'实例
Dim message As Variant
Dim message
3.数组
'语法
'固定长度数组声明
Dim [变量名](开始序号 to 结束序号) As [数据类型]
'动态数组声明
Dim [变量名]() As [数据类型]
'实例
'声明包含10个文本类型元素的数组
Dim names(1 to 10) As String
'声明长度未知的文本类型数组
Dim names() As String
4.对象
声明对象时,一般有两种方式。一种是前期绑定,即一开始就指定对象的类型;一种是后期绑定,即声明时不指定对象类型,后期指定。
'语法
'前期绑定声明语法
Dim [变量名] As [对象类型]
'后期绑定声明语法
Dim [变量名] As Object
'实例
Dim sh As Worksheet
Dim car As Object
声明多个同类型变量
'声明两个整数类型的 i、j 变量
Dim i,j As Integer
首先,以上写法,语法上没问题,不会出现错误。但是,这种方式声明变量,Integer 类型只作为第二个 j 变量的数据类型。第一个变量,即 i 变量,它的数据类型是 Variant,并不是 Integer 类型。
因此,VBA 中不能合并声明语句。正确的声明方法如下:
'第一种,按两行写
Dim i As Integer
Dim j As Integer
'第二种,使用 : 符号,在一行写
Dim i As Integer : Dim j As Integer
基本类型变量的赋值
基本类型变量是存储单个值的变量,例如数字、文本、日期等。
VBA 中,给基本类型变量赋值,以 Let关键词开头。赋值操作是给=左侧的变量,用=右边的数据,指定其代表的值。在后续的代码中,该变量就代表指定的数据。
在实际开发中,给基本类型变量赋值时,Let关键词可以忽略不写,直接以变量开头写赋值语句。
给基本类型变量赋值语法如下:
'语法,两种写法相同
Let [变量名] = [数据]
[变量名] = [数据]
'实例
Dim name As String
Let name = "Zhang San"
Dim age As Integer
Let age = 30
Dim birthday As Date
Let birthday = #2000-1-1#
赋值语句中,=右侧可以是包含其他变量、函数、复杂计算的表达式。该表达式返回的值的类型,与变量类型一致就可以正常赋值。
Dim birthday As Date
Dim age As Integer
birthday = #2000-1-1#
age = Year(Now) - Year(birthday)
一种特殊情况是,=右侧可以是变量本身。这种方式多用于循环结构中。
Dim i As Integer
Do While i < 10
Msgbox i
i = i + 1
Loop
'返回 => 0,1,2,3,4,5,6,7,8,9
Variant 类型变量的赋值
我们知道 Variant 类型时通用类型,因此赋值很直接,没有类型强制要求。Variant 类型变量第一次赋值后,可以继续赋值其他类型数据。
'声明变量(两者相同)
Dim message As Variant
Dim message
'赋值
message = "Hello World"
message = 1234567890
message = #2018-12-1#
数组类型变量的赋值
数组是可以存储多个同类型元素的数据类型。声明时一般指定其数据长度。给数组赋值时,一般使用每个元素的序号。
数组赋值基本语法如下:
[数组名](元素序号) = [数据]
下面看一下实际的实例。
'声明数组
Dim arr(1 to 5) As String
'数组赋值
arr(1) = "Zhang San"
arr(2) = "Li Si"
arr(3) = "Wang Wu"
对象类型变量的赋值
对象类型变量赋值时,不同于基本类型变量使用Let(可以忽略)关键词,对象使用 Set 关键词,并且Set关键词不能省略。
如下是对象类型变量基本的赋值方法:
Set [变量名] = [对象类型数据]
下面看一下实际的用法。
'声明工作表类型的对象
Dim sheet As Worksheet
'将名称为“绩效表”的工作表,赋到 sheet 变量
Set sheet = Worksheets("绩效表")
由于对象可以包含多个属性,因此 VBA 提供一种同时给多个属性赋值的简单方法。具体方法是对象多个属性赋值语句,放置在 With+对象和End With关键词中间。
Dim sheet As Worksheet
Set sheet = Worksheets("绩效表")
With sheet
.Name = "旧绩效"
.Visible = False
End With