在 VBA 中,与在任何其他编程语言中一样,变量和常量用于存储任何值。 顾名思义,变量可以改变,而常量存储固定值。
例如,一个常数 Pi 存储值 3,14159265…… 数字“Pi”在程序执行过程中不会改变,但将这样的值存储为常数还是更方便。
同时,我们可以使用变量 增值税税率 存储所购商品的增值税率。 变量值 增值税税率 可能因购买的产品而异。
数据类型
所有变量和常量都属于特定的数据类型。 下表列出了 VBA 中使用的数据类型以及可能值的描述和范围:
数据类型 | 尺寸 | 产品描述 | 取值范围 |
---|---|---|---|
字节 | 1字节 | 正整数; 常用于二进制数据 | 从0到255 |
布尔 | 2字节 | 可以是真或假 | 对或错 |
整数 | 2字节 | 整数(无小数部分) | 从-32到+768 |
长 | 4字节 | 大整数(无小数部分) | от -2 147 483 648 до +2 147 483 647 |
单 | 4字节 | 单精度浮点数 | 从 -3.4e38 到 +3.4e38 |
双 | 8字节 | 双精度浮点数 | 从 -1.8e308 到 +1.8e308 |
货币 | 8字节 | 浮点数,小数位数固定 | от -922 337 203 685 477.5808 до +922 337 203 685 477.5807 |
日期 | 8字节 | 日期和时间——日期类型的数据由浮点数表示。 这个数字的整数部分表示日期,小数部分表示时间。 | 从 1 年 100 月 31 日到 9999 年 XNUMX 月 XNUMX 日 |
摆件 | 4字节 | 对象引用 | 任何对象引用 |
串 | 在改变 | 字符集。 String 类型可以是固定长度或可变长度。 更常用于可变长度 | 固定长度 - 最多大约 65 个字符。 可变长度——最多约 500 亿个字符 |
变种 | 在改变 | 可能包含日期、浮点数或字符串。 这种类型用于事先不知道将输入什么类型的数据的情况。 | 数字 - 双精度,字符串 - 字符串 |
显然,使用上表并选择正确的数据类型,可以更经济地使用内存(例如,选择数据类型 整数 代替 长 or 单 代替 双)。 但是,当使用更紧凑的数据类型时,您需要注意您的代码不要尝试将不成比例的大值放入其中。
声明变量和常量
译者注: 说到 VBA 中的变量,值得一提的是更重要的一点。 如果我们声明了一个变量但没有给它赋值,那么它会被初始化为一个默认值:
• 文本字符串用空字符串初始化;
• numbers — 值 0;
• 类型变量 布尔 - 错误的;
• 日期 – 30 年 1899 月 XNUMX 日。
在使用变量或常量之前,必须先声明它。 为此,请将以下简单的代码行添加到宏中:
Dim Имя_Переменной As Тип_Данных
在上面的代码行中 变量名 是将在代码中使用的变量的名称,并且 数据类型 是本文前面给出的表中的数据类型之一。 例如:
将 sVAT_Rate 调暗为单个 Dim i As Integer
常量的声明方式类似,但在声明常量时,必须立即指出它们的值。 例如,像这样:
常量 iMaxCount = 5000 常量 iMaxScore = 100
不必在 Excel 中声明变量。 默认情况下,Excel 中所有输入但未声明的变量都将具有类型 变种 并且将能够接受数字和文本值。
因此,程序员可以随时使用新的变量(即使它没有被声明),Excel 会将其视为类型变量 变种. 但是,不应该这样做有几个原因:
- 内存使用和计算速度。 如果你没有声明一个带有数据类型指示的变量,那么默认情况下它将被设置为类型 变种. 此数据类型比其他数据类型使用更多内存。 每个变量的几个额外字节听起来可能不多,但实际上,程序可以有数千个变量(尤其是在使用数组时)。 因此,变量使用的额外内存如 变种, 与类型变量相比 整数 or 单, 可以加起来很大。 此外,具有类型变量的操作 变种 执行速度比其他类型的变量慢得多,分别是额外的一千个类型的变量 变种 可以显着减慢计算速度。
- 防止变量名中的拼写错误。 如果声明了所有变量,则可以使用 VBA 语句 - 选项显式 (我们稍后会谈到)以识别所有未声明的变量。 这消除了由于错误写入变量名而在程序中出现的错误。 例如,使用一个名为 增值税税率,你可以打错字,给这个变量赋值,写:“VATRate = 0,175”。 预计从现在开始,变量 增值税税率 应该包含值 0,175 - 但当然不是。 如果启用强制声明所有使用的变量的模式,那么 VBA 编译器将立即指示错误,因为它不会找到该变量 增值税率 在那些宣布。
- 突出显示与变量声明类型不匹配的值。 如果你声明一个特定类型的变量并试图为其分配不同类型的数据,你会得到一个错误,如果不加以纠正,可能会导致程序崩溃。 乍一看,这似乎是不声明变量的一个很好的理由,但实际上,与以前相比,其中一个变量接收到了它应该接收的错误数据——这样更好! 否则,如果程序继续运行,结果可能是不正确的和意外的,并且要找到错误的原因将变得更加困难。 宏也有可能“成功”执行。 结果,错误将被忽视,工作将继续使用不正确的数据!
在这方面,希望尽早检测出不正确的数据类型并纠正代码中的此类错误。 由于这些原因,建议您在编写 VBA 宏时声明所有变量。
选项显式
操作者 选项显式 导致声明将在 VBA 代码中使用的所有变量,并在编译期间(在代码执行开始之前)将所有未声明的变量标记为错误。 应用这个运算符并不难——只需在 VBA 文件的最顶部写下这一行:
Option Explicit
如果你想总是插入 选项显式 到创建的每个新 VBA 模块的顶部,这可以自动完成。 为此,您需要启用该选项 需要变量声明 在 VBA 编辑器设置中。
这是这样做的:
- 从 Visual Basic 编辑器菜单中,单击 工具 > 附加选项
- 在出现的对话框中,打开选项卡 编者
- 勾选方块 需要变量声明 并按下 OK
启用时,字符串 选项显式 将自动插入到创建的每个新模块的开头。
变量和常量的范围
每个声明的变量或常量都有自己的有限范围,即该变量所在的程序的有限部分。 范围取决于变量或常量的声明位置。 以变量为例 增值税税率, 在函数中使用 总消耗. 下表讨论了变量作用域的两个选项 增值税税率在模块的两个不同位置声明:
Option Explicit Dim sVAT_Rate As Single Function Total_Cost() As Double ... End Function | 如果变量 增值税税率 在模块的最开始声明,那么这个变量的作用域就是整个模块(即变量 增值税税率 将被本模块中的所有程序识别)。 因此,如果在函数中 总消耗 变量 增值税税率 将被分配一些值,然后在同一模块中执行的下一个函数将使用该变量 增值税税率 具有相同的含义。 但是,如果调用位于另一个模块中的某个函数,那么它的变量 增值税税率 将不为人知。 |
Option Explicit Function Total_Cost() As Double Dim sVAT_Rate As Single ... End Function | 如果变量 增值税税率 在函数开头声明 总消耗, 那么它的作用域将仅限于这个函数(即函数内 总消耗, 你可以使用变量 增值税税率,但不在外面)。 尝试使用时 增值税税率 在另一个过程中,VBA 编译器将报告错误,因为该变量未在函数外部声明 总消耗 (前提是使用了运算符 选项显式). |
在上面显示的示例中,变量在模块级别使用关键字声明 暗淡. 但是,声明的变量可能需要在其他模块中使用。 在这种情况下,声明一个变量而不是关键字 暗淡 必须使用关键字 公共.
顺便说一句,为了在模块级别声明一个变量,而不是关键字 暗淡 可以使用关键字 私做,这表明此变量仅适用于当前模块。
您还可以使用关键字来声明常量。 公共 и 私做,但不能代替关键字 常量,随之而来。
以下示例显示了关键字的使用 公共 и 私做 应用于变量和常量。
Option Explicit Public sVAT_Rate As Single Public Const iMax_Count = 5000 ... | 在本例中,关键字 公共 用于声明变量 增值税税率 和常数 i最大计数. 以这种方式声明的元素范围将是整个当前项目。 这意味着 增值税税率 и i最大计数 将在任何项目模块中可用。 |
Option Explicit Private sVAT_Rate As Single Private Const iMax_Count = 5000 ... | 在这个例子中,声明一个变量 增值税税率 和常数 i最大计数 使用的关键字 私做. 这些元素的范围是当前模块。 这意味着 增值税税率 и i最大计数 将在当前模块的所有过程中可用,但对其他模块中的过程不可用。 |