VBA 中的变量和常量

在 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 会将其视为类型变量 变种. 但是,不应该这样做有几个原因:

  1. 内存使用和计算速度。 如果你没有声明一个带有数据类型指示的变量,那么默认情况下它将被设置为类型 变种. 此数据类型比其他数据类型使用更多内存。 每个变量的几个额外字节听起来可能不多,但实际上,程序可以有数千个变量(尤其是在使用数组时)。 因此,变量使用的额外内存如 变种, 与类型变量相比 整数 or , 可以加起来很大。 此外,具有类型变量的操作 变种 执行速度比其他类型的变量慢得多,分别是额外的一千个类型的变量 变种 可以显着减慢计算速度。
  2. 防止变量名中的拼写错误。 如果声明了所有变量,则可以使用 VBA 语句 - 选项显式 (我们稍后会谈到)以识别所有未声明的变量。 这消除了由于错误写入变量名而在程序中出现的错误。 例如,使用一个名为 增值税税率,你可以打错字,给这个变量赋值,写:“VATRate = 0,175”。 预计从现在开始,变量 增值税税率 应该包含值 0,175 - 但当然不是。 如果启用强制声明所有使用的变量的模式,那么 VBA 编译器将立即指示错误,因为它不会找到该变量 增值税率 在那些宣布。
  3. 突出显示与变量声明类型不匹配的值。 如果你声明一个特定类型的变量并试图为其分配不同类型的数据,你会得到一个错误,如果不加以纠正,可能会导致程序崩溃。 乍一看,这似乎是不声明变量的一个很好的理由,但实际上,与以前相比,其中一个变量接收到了它应该接收的错误数据——这样更好! 否则,如果程序继续运行,结果可能是不正确的和意外的,并且要找到错误的原因将变得更加困难。 宏也有可能“成功”执行。 结果,错误将被忽视,工作将继续使用不正确的数据!

在这方面,希望尽早检测出不正确的数据类型并纠正代码中的此类错误。 由于这些原因,建议您在编写 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最大计数 将在当前模块的所有过程中可用,但对其他模块中的过程不可用。

发表评论