????????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为前缀,有颜色、星期、按钮、符号(如换行符)等相关内置常量
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
? ? ? ? ?
? ? ? ? 设置:工具→选项→编辑器→要求变量声明
? ? ? ? 模块中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
? ? ? ? 缺省时默认为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 '逻辑蕴含
? ? ? ? & '可连接任意数据
? ? ? ? +?'只能连接文本字符
提示:
????????循环数组中的所有元素,可以利用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 集合中元素 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
for 循环一般用在已经循环多少次的情况,当未知时一般使用Do...Loop循环
????????Do While 判定条件
????????????????循环体
????????Loop
????????Do
????????????????循环体
????????Loop While 判定条件
????????Do Until 判定条件
????????????????循环体
????????Loop
????????Do
????????????????循环体
????????Loop?Until 判定条件
条件成立就执行类似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 变量或表达式
? ? ? ? ? ? ? ? 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语句