宏属于脚本语言,就是不需要编译为exe文件,可以由解释器直接解释运行。
可以通过Sub关键字来定义一个过程
格式为Sub宏名称()
而过程相当于一个函数的概念,一个模块中也可以定义为多个过程,每个过程其实就是一个宏,都可以被单独使用,也可以在过程内通过call 过程名的方式调用另一个过程。
宏名称可以是中文
例如:
Sub 宏示例()
Cells.Select '选中单元格
Range("G22").Activate '将G22单元格设置为活动单元格
Selection.Copy '复制G22其中的内容
Sheets("Sheet1").Select '选择sheet1
Cells.Select '选择sheet1中的单元格
Range("F26").Activate '将sheet1中的F26作为活动单元格
ActiveSheet.Paste '将复制的内容粘贴到F26中
End Sub
其中Cells、Sheets、ActiveSheet是VBA的对象。
‘表示注释,其内容不被执行,相当于Python里的#’
同时我们还需要明确一个前提,即一个excel文件内可能保护多个sheet,每一个sheet一系列单元格cell。
1、数据类型
VBA中有多种基本数据类型可选择:
类型名称 | 关键字 |
---|---|
整型 | Integer |
单精度 | Single |
双精度 | Double |
字符型 | String |
长整型 | Long |
每个数据类型其实还有简写,不过其简写都是用符号代替,个人决定这样的简写可能会降低代码的可读性。同时VBA还能降低对象类型。
2、变量声明与定义
Public:可定义全局变量
Dim:可定义局部变量
声明变量的语法为:
Dim变量名 As 数据类型
Public变量名 As 数据类型
3、变量定义复制
声明变量后,还需对变量进行赋值,包括基本类型的变量赋值,对象类型的变量赋值
1、给基本类型的变量赋值,直接使用变量名=值的语法即可。
2、给对象类型的变量赋值,需要利用到Set关键字,语法为Set 变量名=值。
eg.
Sub example()
'给基本类型变量赋值
Dim localNum As Integer
localNum = 22
'给对象类型变量赋值
Dim obj As Range
Set obj = Range("c1")
End Sub
4、简单逻辑用法
1. 顺序结构
顾名思义就是按照顺序结构执行每一条语句,从上到下,从左到右。
2.选择结构
① If Then 结构
选择结构中,If Then 结构是最基础的一个。它只有条件表达式真时,才执行的代码。
If Then 结构基本语法如下,其中End If是选择结构的结束标志。
If 条件表达式 Then
'表达式为真时,执行
End If
举个例子:
Sub VBAexample()
Dim i As Integer '定义i为整型变量
For i = 2 To 10 'i的值再2——10范围遍历
If Cells(i,"B").Value >= 100 Then '依次选中B2-B10的单元格,查看其值是否大于100
Cells(i,"C") = "是" '大于100则在Ci单元格填入“是”
End If
Next i '让i自增
End Sub '结束
② If Else 结构
相对于if then 多了一个非此即彼的选择。
即If Else结构中,条件表达式在真时,执行Then后的代码;条件表达式为假时,执行 Else后的代码。基本语法如下:
If 条件表达式 Then
'真时执行的代码
Else
'假时执行的代码
End If
3. 循环结构
VBA提供了多种循环结构,和C、python的循环结构十分类似,【…】处为执行循环体内代码的条件,它们的差别在于【执行循环体内代码】和【判断是否满足循环条件】的顺序。
循环结构 | 说明 |
---|---|
For … Next | 按指定次数循环执行 |
For Each | 逐一遍历数据集合中的每一个元素 |
Do While … Loop | 当条件为真时,循环执行 |
Do … Loop While | 当条件为真时,循环执行。无论条件真假,至少运行一次 |
Do Until … Loop | 直到条件为真时,循环执行 |
Do … Loop Until | 直到条件为真时,循环执行。无论条件真假,至少运行一次 |
下面是上述某些循环结构的例子:
(1)For … Next 循环
使用 For … Next循环可以指定次数,在制定次数没有到达上限之前循环执行一段代码。
(2)For 循环
For 循环使用一个数字变量,从初始值开始,每循环一次,变量值增加或减小,直到变量的值等于指定的结束值时,循环结束。
For … Next 循环语法如下:
For [变量] = [初始值] To [结束值] Step [步长]
'这里是循环执行的语句
Next
其中:
[变量] 是一个数字类型变量,可在循环执行的语句里使用。
[初始值] 和 [结束值] 是给定的值;
[步长]是每次循环时,变量的增量。如果为正值,变量增大;如果为负值,变量减小。
下面看一个实际的例子,求 1 至 100内 数字的奇数累积和。
Sub VBAexample()
Dim i As Integer
Dim sum As Integer
For i = 1 To 100 Step 2
sum = sum + i
Next
End Sub
循环变量i的取值分别是1、3、5、7…99,当最后i=101时,不在满足小于100的条件,循环结束。
值得注意的是,For 循环的 Step 值如果是 1,则 Step 关键词可省略。
(3)Do While …循环
Do While循环用于满足指定条件时循环执行一段代码的情形。循环的指定条件在 While关键词后书写。
(4)Do While … Loop循环
根据 While 关键词后的条件表达式的值,真时执行,假时跳出循环转而执行Loop后的代码。基本语法如下:
Do While [条件表达式]
'循环执行的代码
Loop
依旧看刚才求 1- 100内奇数累积和的例子。
Sub VBAexample()
Dim i As Integer
Dim sum As Integer
i = 1
Do While i <= 100
sum = sum + i
i = i + 2
Loop
End Sub
i变量的初始值是 1,根据 While 后的条件,只要 i 变量小于等于 100,后续的代码就可以一直循环执行。
其他循环结构的代码类似。
4. with结构
个人感觉这个结构特别像c的结构体,只不过不用先在主函数外面定义结构体。使用 With 结构定义一个对象,通过【.】调用其内置参数,这样可以避免重复写同一个对象名,从而精简代码量。
with结构基本语法如下:
With [对象]
.[属性] = [数据]
.[方法]
'其他属性和方法
End With
With 结构里,对象的属性和方法均有点 (.)符号开始,后接对象的属性名和方法名。
下面是With 结构的一个实例
若需要将工作簿中 Sheet1 工作表设置新名称,然后设置标签颜色为黑色,最后隐藏工作表。
(1)不用 With 结构,代码如下:
Sub VBAexample()
Worksheets("Sheet1").Name = "新名称"
Worksheets("Sheet1").Tab.ThemeColor = xlThemeColorLight1
Worksheets("Sheet1").Visible = xlSheetHidden
End Sub
可以看到,每个语句都重复写 Worksheets(“Sheet1”) 部分。
(2)使用with结构,代码如下:
Sub VBAexample()
Sub VBAexample()
With Worksheets("Sheet1")
.Name = "新名称"
.Tab.ThemeColor = xlThemeColorLight1
.Visible = xlSheetHidden
End With
End Sub
5、常用对象选择、操作
(1)改变背景色
Range("A3").Interior.ColorIndex = xlNone
ColorIndex参数选择:
(2)改变文字颜色
Range("A3").Font.ColorIndex = 4
(3)获取单元格
Cells(2, 4)
Range("A4")
(4)获取范围
Range(Cells(4, 5), Cells(8, 9))
Range("a2:c7") '用快捷记号引用单元格
Worksheets("Sheet2").[A2:B6]
(5)选中某sheet
Set NewSheet = Sheets("sheet2")
NewSheet.Select
(6)隐藏文档
Application.Visible = False
(7)禁止屏幕更新
Application.ScreenUpdating = False
(8)禁止显示提示和警告消息
Application.DisplayAlerts = False
(9)文件夹做成
strPath = "C:\temp\"
MkDir strPath
(10)状态栏文字表示
Application.StatusBar = "计算中"
(11)选中或激活某单元格
“Range”对象的的Select方法可以选择一个或多个单元格,而Activate方法可以指定某一个单元格为活动单元格
'下面的代码首先选择A1:E10区域,同时激活D4单元格:
Range("a1:e10").Select
Range("d4:e5").Activate
'而对于下面的代码:
Range("a1:e10").Select
Range("f11:g15").Activate
'由于区域A1:E10和F11:G15没有公共区域,将最终选择F11:G15,并激活F11单元格。
(12)获得文档的路径和文件名
ActiveWorkbook.Path'路径
ActiveWorkbook.Name '名称
ActiveWorkbook.FullName '路径+名称
'或将ActiveWorkbook换成thisworkbook