数据类型
- 常用数据类型
Integer:整数,-32,768到32,767之间的整数
Long:较长长整数,-2,147,483,648到2,147,483,647之间的整数
Single:浮点数,它可以存储大约:6到7位小数的精度。
Double:较长浮点数,大约15位小数的精度
Boolean:布尔值,只有两个取值,True和False
Date:日期
Object:任何对象引用
String:字符串
- 自定义数据类型
标准模块中需要使用Type语句,类模块中需要使用Private Type
示例:
Type AA
ID As Integer
Name As String
Phone As Long
end Type
声明及使用常量
数值常量:如1、3.7
字符常量:用双引号表示,如"AA"
符号常量:声明符号常量时可以同时定义数据类型
用法:
Const 常量名 = 常量值
示例:
Const Name = "小明"
Const Name As String = "小明"
逻辑常量:只有两个:True、False
日期常量:有两种表示方法
示例:
(1) a = #20/1/2024#
(2) a = "2024-3-2"
内置常量:一般以vb或xl为前缀,有颜色、星期、按钮、符号(如换行符)等相关内置常量
MsgBox的Buttons参数
vbOKOnly:对应值为0,只显示“确定”按钮,即默认情况,而0也无需在参数中特意指明。
vbOKCancel:对应值为1,同时显示“确定”和“取消”按钮。
vbAbortRetryIgnore:对应值为2,同时显示“中止”、“重试”、“忽略”按钮。
vbYesNoCancel:对应值为3,显示“是”、“否”、“取消”按钮。
vbYesNo:对应值为4,显示“是”和“否”按钮。
vbRetryCancel:对应值为5,显示“重试”和“取消”按钮。
示例
Public Sub test()
Dim res
res = MsgBox("是否进行数据修改", 4)
If res = vbYes Then
'修改数据语句
End If
End Sub
声明及使用变量
- VBA允许使用未定义变量,但容易发生错误,所以一般设置成强制声明变量。
设置:工具→选项→编辑器→要求变量声明
模块中Option Explicit 表示强制声明变量
注意:
变量要以字母或汉字开头,并只能由字母、汉字、字母、下划线组成
- 定义变量
一般使用Dim定义,也可以使用ReDim、Public、Private、Static
示例:
Dim XY As string #初始值为空字符串
- 使用类型标识符定义变量
(如果设置了强制声明变量,这种方法是不被允许的)
常用标识符
$:字符串
%:整形
&:长整型
! :浮点数
@:货币型
示例:
a$ = "小明
d! = 1300
- 定义和使用对象变量
(用Object作为对象变量通用关键词,为了使程序可读性更强、运行快,最好创建引用到具体对象类型的对象变量,如用Range或Worksheet作为关键词
声明对象变量:
Dim Rng As Object ’声明变量Rng为对象变量
Dim Rng As Worksheet ‘声明要引用一个工作表为对象Rng的值
赋值对象变量:
Set Rng = Worksheets("Sheet1").Range("A1:E10") '赋值对象变量为工作表Sheet1中单元格
- 定义模块级变量
模块级变量:是指对模块中所有的子程序和函数都有效的变量
用法:可在该模块的顶部使用Dim或Private进行声明
例如:
Dim x As String,y As String
- 定义公共变量
公共变量:对所有模块的子程序和函数都有效
用法:应在某标准模块的顶部使用Public 进行声明,一般可以创建一个专门保存公共变量的标准模块,以便于查看变量的定义和使用
例如:
Public ws As Worksheet
定义数组
- 定义静态数组
静态数组:是指维度和大小固定不变的数字
一维数组:
Dim A(10) As Long 或 Dim A(0 To 10) As Long '表示从0到10是一个数
二位数组
Dim A(2,10) As Long 或 Dim A(0 To 2,0 To 9) As Long '表示从0到2和从0到10,他们交叉相乘为30,所以数组大小为30
示例
Sub test()
Dim ws As Worksheet
Dim i As Long
Dim aa(1 To 9) As String
Set ws = Worksheets("1")
For i = 1 To 9
aa(i) = ws.Range("A" & i + 1)
Next i
End Sub
- 定义动态数组
动态数组:是指在程序运行时其大小可以变化,使用动态数组可以节省内存,加快运行速度
用法:
ReDim ABC(n) As String
注意:动态属于组的声明语句必须放在数组元素变量赋值语句后面
补充:Excel VBA中使用Range时,有一个End属性,以Range单元格为基准定位到其上、下、左、右最后一个有数据的单元格,也可以用数字表示。
其中1代表:xlToLeft
其中2代表:xlToRight
其中3代表:xlup
其中4代表:xldown
示例:
Sub AA()
Dim i As Integer
Dim n As Integer
n = Range("A10000").End(xlUp).Row - 1 '表示表中A10000区域内最后一行的行号
ReDim AA(1 To n) As String
For i = 1 To n
AA(i) = Range("A" & i)
Next i
End Sub
- 将数组的缺省下界设置为1
缺省时默认为0
方法一:
dim A(1 to 3) as string
redim A(1 to n) as string
方法二:在模块顶部写入如下语句
Option Base 1
- 获取数组的最小下标和最大下标
LBound() 获取最小下标
UBount() 获取最大下表
补充:MsgBox ‘输出标题
示例:
Dim a(10,2,4) As String
MsgBox LBound(a,3) ’表示第三维度的最小下标
数据运算规则及运算符
- 赋值运算符
=
- 数学运算符:
+、-、*、/、\、-、^ '加、减、乘、除、整除、符号、乘幂
- 比较运算符:
=、<>(不等于)、>、<、>=、<=、Like(字符串模糊匹配)、Is(逻辑)
示例:表示判断A列表里有媒体字样和B列表匹配北京就输出
If Range("A" & i) Like "*媒体*" And Range("B" & i) = "背景" Then
MsgBox "客户:" & Range("A" & i)
- 逻辑运算符:
Not '非
And '与
Or '或
Xor '异或
Eqv '相等
Imp '逻辑蕴含
- 字符连接运算:
& '可连接任意数据
+ '只能连接文本字符
语句基础知识
循环语句
For ... Next循环语句
提示:
循环数组中的所有元素,可以利用UBound和LBound然后通过For...Next进行循环
循环集合中所有对象:也可以利用集合中Count属性获取集合对象个数通过For..Next进行循环
语法:
For 计数器 = 初始值 To 终值 [步长] '步长可以为负数,默认为1
[循环体]
[Exit For] '退出循环,一般设置一个条件判断语句
[循环体]
Next 计数器 '计数器 = 计数器 + 步长
示例:九九乘法表
Public Sub test()
Dim i As Integer, j As Integer
Range("A1") = "九九乘法表"
For i = 1 To 9
For j = 1 To i
Cells(i + 1, j) = i & "*" & j & "=" & i * j
Next j
Next i
End Sub
结果显示:
For Each...Next 循环语句
For Each...Next 是对集合中所有元素进行循环
语法:
For Each 集合中元素 In 集合
示例:循环当前工作博中所有工作表,并把表名输出到当前工作表A列
Public Sub test()
Dim ws As Worksheet
Dim i As Integer
i = 1
For Each ws In ThisWorkbook.Worksheets '把表对象赋值给ws
Range("A" & i) = ws.Name
i = i + 1
Next
Set ws = Nothing
End Sub
Do ... Loop 循环
for 循环一般用在已经循环多少次的情况,当未知时一般使用Do...Loop循环
- 第一中结构:先判定在循环
Do While 判定条件
循环体
Loop
- 第二种结构:先循环在判定
Do
循环体
Loop While 判定条件
- 第三种结构:判定条件为False时执行循环
Do Until 判定条件
循环体
Loop
- 第四种结构:
Do
循环体
Loop Until 判定条件
- 推出Do循环:Exit Do,一般设置判断语句
使用While ... Wend 循环
条件成立就执行类似Do While .. Loop
语法结构:
While 条件判断
循环体
Wend
条件控制语句
单行语法:如果符合就语句1否则就语句2
If 条件 Then 语句 1 [Else 语句2]
多行语法一:如果符合就语句
If 条件 Then
语句块
End If
多行语法二:如果符合就语句1否则就语句2
If 条件 Then
语句1
Else
语句2
End If
多行语法三:
If 条件1 Then
语句1
ElseIf 条件2
语句2
ElseIf 条件3
语句3
...
[ Else
语句n ]
End If
补充:Exit Sub '表示退出程序,可以跟条件语句结合使用
示例:
Public Sub test()
Dim res
res = MsgBox("是否进行数据修改", vbYesNo + vbQuestion)
If res = vbYes Then
'修改数据语句
End If
End Sub
Select Case语句
在使用多分支语句比较麻烦时可以使用Select Case语句
语法:
Select Case 变量或表达式
Case 值1 ‘如果符合值1就执行语句1
语句1
[Case 值2 '如果符合值2就执行语句2....
语句2]
....
End Select
提示:其中,值1、值2...可以取以下几种形式
(1)具体常数:如1、2、A、"汉语"..
(2)连续的数据范围,如1 To 100 ,A To C 等
(3)满足某哥条件的表达式。如Is关系表达式
例: Case Is <5,10,30,40,Is > 100
语句书写技巧
- 为了简洁明了,可以将多行类似语句写在同一行
对于赋值语句,需要用冒号隔开
对于声明语句,需要用逗号隔开
- 断行:
在VBA中一行最多255字符,可以在行尾追加一个空格和一个下划线进行换行
- 两种注释方法:
(1)'
(2)Rem ,此时注释语句只能单独一行
使用With语句提高程序运行效率
当使用对象的诸多属性和方法时,最好使用With语句