1.变量
变量的划分方式:一般变量可以按照数据类型划分,也可以按照作用范围进行划分
1.1 按照数据类型划分的变量
- 变量按照数据类型一般分为:数据变量、对象变量和数组变量
-
1.1.1 数据变量的定义
数据变量的定义一般用
dim 变量名 as 变量类型
的方式;但基于一般VBA项目较小情况,可以不指定数据类型,直接使用
dim 变量名
Dim a As Integer '完整定义方式,指明数据类型
Dim i '简单定义方式,不指明数据类型
1.1.2 对象变量的定义
数据变量的定义一般用
dim 变量名 as 对象类型
的方式;对象变量不能省略对象类型,再不济也需要定义成Object;
Dim rng As Range '定义rng为一个range类型
rng = Workbooks("AA").Worksheets("sheet1").Range("A1")
1.1.3 数组变量的定义
VBA中最常用的数组为一维数组和二维数组
- 只有横排的一行数据是一维数组。纵排的一列数据和矩阵数据都是二维数组
Dim ary1(1 To 5) '定义一个5行列的一维数组
Dim ary2(1 To 5, 1 To 6) '定义一个5行6列的二维数组
1.2 按照作用范围划分变量
1.2.1 局部变量
局部变量只能在过程内定义,且仅作用于本过程 ```vbnet Public Sub 宏1() Dim i i = 1 Debug.Print i ‘输出结果为1 End Sub
Public Sub 宏2() Debug.Print i ‘输出结果为”” End Sub
:::info
以上代码中,宏1可以输出1。但变量i定义在宏1的过程中,属于宏1的局部变量,宏2无法调用此变量,故宏2输出""
:::
<a name="Xggpo"></a>
### 1.2.2 全局变量
1. 全局变量定义在**模块顶部;**
2. `Public`关键字定义的全局变量可以作用于所有模块,而`Private`关键字定义的全局变量只能作用于其所在的模块;
3. 在工作表中定义的public变量在其他模块也不能直接调用。如果调用需要用`工作表名.变量名`;
4. 为了防止变量污染,一般命名全局变量使用`public global_i`,`private module_i`
```vbnet
Public a
Private b
Public Sub 宏1()
a = 4
b = 5
End Sub
Public Sub 宏2()
Debug.Print a '输出结果为4
Debug.Print b '输出结果为5
End Sub
'module 1
Public a
Private b
Public Sub 宏1()
a = 4
b = 5
End Sub
----------------------------------------------------------------
'module 2
Public Sub 宏2()
Debug.Print a '输出结果为4
Debug.Print b '输出结果为""
End Sub
:::info
- 在模块module 1中定义的a,b变量在module 2中打印。只有用public关键字定义的全局变量a能够返回数据,而b输出结果为””:
-
1.3 变量的赋值
数据变量赋值可以使用关键字
Let
,但Let关键字通常省略;- 对象变量的赋值需要使用
Set
关键字,且该关键字不能省列; - 数组变量赋方式较多,花括号方式,Array()方式,转置函数方式等 ```vbnet Public Sub 宏1()
Dim a ‘定义数据变量a,未指定数据类型 Dim rng As Range ‘定义单元格对象变量rng
a = 1 Set rng = [A1] ‘把A1单元格赋值给单元格对象
Debug.Print a Debug.Print rng.Address
End Sub
:::info
代码运行结果为:<br /> 1 <br />$A$1
:::
```vbnet
Public Sub 宏1()
[b1:f1] = Array(1, 2, 3, 4, 5)
[b2:f2] = [{1,2,3,4,5}]
[b4:b6] = WorksheetFunction.Transpose(Array(1, 2, 3))
[b8:b10] = [{1;2;3}]
End Sub
:::info
各种数组赋值方式的区别:
- 花括号方式既能赋值一维数组也能赋值二维数组。其中
,
隔开的横向排列(为一维数组),;
隔开纵向排列(为二维数组) - Array()方式中括号内只能以
,
隔开,且隔开的元素横向排列 若想通过Array的方式赋值纵向数组,需要使用
WorksheetFunction.Transpose
函数 :::1.4 变量的强制声明
如果打开变量强制声明按钮,则强制用dim声明所有变量(工具-选项)
- 强制声明变量后,在模块的最上方出现
Option Explicit
强制声明提示,该提示可以通过被注释掉解除变量的强制声明; - 建议实操过程中用所有变量都用dim声明,为了防止变量污染
- 查看一个变量是否被定义,选中改变量,右键-定义
2.常量
- 常量就是固定不变的数据
- 常量被重新赋值时会报错,即可读不可写
- 常量不用类似变量需要先定义再赋值,而是通过关键字直接定义和赋值
- 常量不能是对象类型
2.1 按照来源划分的常量
- 用户自定义常量
-
2.2 按照作用范围划分的常量
定义过程级常量的关键字
Const
- 定义模块级常量的关键字
Private Const
- 定义工程级常量的关键字
Public Const
```vbnet ‘module 1
Public Const a = 1 ‘定义工程级常量 Private Const b = 2 ‘定义模块级常量
Public Sub 宏1()
Const c = 3 '定义过程级常量
Debug.Print a
Debug.Print b
Debug.Print c
End Sub
Public Sub 宏2()
Debug.Print a
Debug.Print b
Debug.Print c
End Sub
‘module 2
Public Sub 宏3()
Debug.Print a
Debug.Print b
Debug.Print c
End Sub
:::info
输出结果:
1. 宏1中能正常输出a b c为1 2 3
2. 宏2中只能输出a b为1 2
3. 宏3中只能输出a为1
:::
<a name="NEyK3"></a>
# 3.数据类型
| 数据类型 | 类型含义 | 变量声明符 | 存储空间(byte) | 范围描述 |
| --- | --- | --- | --- | --- |
| Byte | 字节 | - | 1 | 0-255的整数 |
| Boolean | 布尔值 | - | 2 | True、False |
| Integer | 整型 | % | 2 | -32768-32767之间的整数 |
| Long | 长整型 | & | 4 | |
| Single | 单精度浮点型 | ! | 4 | |
| Double | 双精度浮点型 | # | 8 | |
| Currency | 货币类型 | @ | 8 | |
| Decimal | 精确类型 | - | 14 | |
| Date | 日期型 | - | 8 | |
| String(变长) | 定长字符串 | $ | 10+字符串长度 | |
| String(定长) | 变长厂字符串 | - | 字符串长度 | |
| Object | 对象变量 | - | 4 | |
| Varient | 变体型 | - | | |
| 用户自定义 | | - | | |
```vbnet
Public Sub 宏1()
Dim a%, b$ '此处声明等价于 Dim a as Integer,b as String
a = 3
b = "hello world!"
Debug.Print a
Debug.Print b
End Sub
:::info
运行结果为:
3
hello world!
:::