简介
本文介绍如何在 Microsoft Visual Basic for Applications Microsoft Excel 子过程中使用变量。
详细信息
子过程中的变量
编程语言的一个强大功能是能够将某些内容存储在变量中,以便可以在该过程的后面部分使用或更改变量的内容。 本文档讨论 Visual Basic 中变量的以下用法:
- 如何声明变量。
- 可以使用 变量的过程和项目。
- 变量的生存期。
在宏中声明变量
在宏中声明变量的最简单方法是使用 Dim 语句。 以下行将两个变量声明为整数:
Dim x As Integer, y As Integer
将 x 和 y 指定为整数时,你告诉 Visual Basic 为整数变量留出足够的内存, (x 和 y) 每个整数变量 2 个字节,并且存储在 x 或 y 中的信息是介于 -32768 和 32767 之间的整数。
注意: 如果使用单个 Dim 语句声明多个变量,则必须为每个变量指定数据类型。
如果未指定每个变量的数据类型(如以下 Visual Basic 代码所示),则只有变量 y 设置为整数变量。 变量 x 将是变体类型:
Dim x, y As Integer
有关其他信息,请参阅下面的 Variant 数据类型 。
若要执行变量测试,请执行以下步骤:
保存并关闭任何打开的工作簿,然后打开新工作簿。
启动 Visual Basic 编辑器 (按 alt+F11) 。
在“插入”菜单上,单击“模块”。
键入以下代码:
Sub Variable_Test()
Dim x As Integer,y As Integer
x = 10
y = 100
MsgBox“x 的值为”& x & _
Chr (13) &“y 的值为”& y
End Sub运行 Variable_Test 宏。 收到以下消息:
the value of x is 10
the value of y is 100单击“确定”。
在 Variable_Test 宏中更改以下行:
x = 10需要:
x = "error"运行 Variable_Test 宏。
你将收到运行时错误,因为“error”不是整数,并且你正尝试将此字符串值分配给整数变量 x。
数据类型摘要
以下是常见的变量数据类型:
变量数据类型
如果在声明变量时未指定数据类型,或者根本不声明变量,则 Visual Basic 会自动指定此变量的变体数据类型。 以下是声明为此数据类型的变量的优点:
- 变量可以包含字符串、日期、时间、布尔值或数值。
- 变量可以自动转换它们包含的值。
缺点是变量至少需要 16 个字节的内存。 16 字节的内存在大型过程或复杂模块中可能很重要。
若要在 Variable_Test 宏中了解其工作原理,请执行以下步骤:
将 Variable_Test 宏中的代码更改为:
Sub Variable_Test()
Dim x, y
x = "string"
y = 1.23
MsgBox "the value of x is " & x & _
Chr(13) & "the value of y is " & y
End Sub
运行 Variable_Test 宏。
不会收到错误,因为可以将任何内容分配给变量 x 和 y。
注意: 还可以省略以下行,宏仍将有效,因为变量 x 和 y 被视为 Variant 数据类型:
Dim x, y
变量的范围
声明变量时,同一模块、其他模块或其他项目中的其他宏可能会看到该变量,也可能看不到该变量。 模块中变量的这种可用性称为范围。 三种类型的范围是过程级、专用模块级和公共模块级别。 范围取决于声明变量的方式和位置。
过程级范围
在声明过程的过程之外,看不到具有过程级范围的变量。 如果设置具有过程级范围的变量的值,则其他宏将不会看到该变量的内容。
若要验证在声明过程的过程之外是否看不到具有过程级范围的变量,请执行以下步骤:
将新模块插入项目中。
在此模块中键入以下两个宏:
Sub Macro1 () Dim x As Integer x = 10 MsgBox “x,如 Macro1 所示为”& x '下一行运行 Macro2 Macro2 End Sub Sub Macro2 () MsgBox “x,如 Macro2 所示为”& x End Sub运行 Macro1,将收到以下消息:
x, as seen by Macro1 is 10单击“ 确定”,将收到以下消息:
x, as seen by Macro2 is单击“确定”。
Macro2 不显示变量 x 的值,因为变量 x 是 Macro1 的局部变量。
专用和公共模块级别范围
可以在模块顶部 (模块的声明部分定义变量,高于所有子过程) ,并使用 Public 语句、Dim 语句或 Private 语句设置变量的范围。 如果将 Public 语句放在变量的前面,则变量将可用于项目中所有模块中的所有宏。 如果将 Dim 语句或 Private 语句放在变量的前面,则变量仅可用于要声明它的模块中的宏。
若要查看 Public 语句和 Dim 语句之间的差异,请执行以下步骤:
保存并关闭任何打开的工作簿,然后打开新工作簿。
启动 Visual Basic 编辑器。
将模块插入项目中。
-
Type the following code into this module: Public x As Integer Sub Macro_1a() x = 10 MsgBox x Macro_1b End Sub Sub Macro_1b() x = x * 2 MsgBox x Macro2 End Sub 将另一个模块插入项目中。
在此模块中键入以下代码:
Sub Macro2()
x = x * 3
MsgBox x
End Sub在第 一个 模块中运行Macro_1a宏。
将变量 x 声明为“Public x As Integer”后,项目中的所有三个宏都可以访问 x 的值。 第一个消息框显示值 10。 第二个消息框显示值 20 (因为 x 乘以 2 Macro_1b) 。 第三个消息框显示值 60 (,因为 x 的值在 Macro_1b 中更改为 20,然后在 Macro2) 中将其乘以 3。
将第一个模块中的声明行更改为:
Public x As Integer需要:
Dim x As Integer运行 Macro_1a 宏。
将变量 x 声明为“Dim x As Integer”时,只有第一个模块中的宏有权访问 x 的值。 因此,第一个消息框显示值 10,第二个消息框显示值 20, (因为 x 乘以 2 Macro_1b) 而第三个消息框显示值 0 (因为 Macro2 看不到 x 的值,并且宏 2) 使用未初始化的值 0。
将第一个模块中的声明行更改为:
Dim x As Integer需要:
Private x As Integer运行 Macro_1a 宏。
使用 Private 语句范围显示的消息框与使用 Dim 语句时显示的消息框相同。 变量 x 具有相同的范围,专用于声明它的模块。
注意: 如果希望变量的范围限制为声明变量的模块,请使用 Privatestatement 而不是 Dim 语句。 它们都达到相同的效果,但如果使用 Private 语句,则读取代码时范围会更清晰。
变量的生存期
变量保留其值的时间称为其生存期。 变量的值可能会在其生存期内更改,但它将保留一个值。 此外,当变量失去范围时,它不再具有值。
初始化变量的值
运行宏时,所有变量都初始化为值。 数值变量初始化为零,可变长度字符串初始化为零长度字符串 (“”) ,固定长度字符串用 ASCII 代码 0 填充。 变量初始化为 Empty。 空变量在数值上下文中由零表示,字符串上下文中由零长度字符串 (“”) 表示。
过程级变量
如果有一个使用 Dim 语句在宏中声明的变量,则只要宏正在运行,该变量就保留其值。 如果此宏调用其他宏,则变量的值将保留 (其他宏不可用,但) 只要这些其他宏也在运行。
若要演示过程级变量的工作原理,请执行以下步骤:
将新模块插入项目中。
在此模块中键入以下两个宏:
Sub Macro1()
'set x 作为过程级别变量
Dim x As Integer
MsgBox“x 的初始化值为”& x
x = 10
MsgBox“x is”& x
“下一行运行 Macro2
Macro2
msgBox“x is still”& x
End Sub
Sub Macro2 ()
MsgBox“x,如 Macro2 所示为”& x
End Sub运行 Macro1。
收到以下消息:
the initialized value of x is 0单击“ 确定”,将收到消息:
x is 10单击“ 确定”,将收到以下消息:
x, as seen by Macro2 is单击“确定”。
Macro2 不显示变量 x 的值,因为变量 x 是 Macro1 的局部变量。 你会收到以下消息:
x is still 10单击“确定”。
运行 Macro1。
您会收到步骤 3 到步骤 6 中所述的相同消息,因为一旦 Macro1 在步骤 6 中停止运行,变量 x 的值就会丢失。 因此,在步骤 7 中重新运行 Macro1 时,第一条消息将 x 的值显示为零, (初始化的值) 。
静态关键字 (keyword)
如果使用静态关键字 (keyword) 声明过程级变量,则变量将保留其值,直到重置项目。 因此,如果你有一个静态变量,则下次调用过程时,静态变量将初始化为其最后一个值。
若要查看静态关键字 (keyword) 的工作原理,请执行以下步骤:
1.
Change the code in Macro1 to:
Sub Macro1()
'set x as a procedure level variable
Static x As Integer
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
运行 Macro1。
你将收到消息:
the initialized value of x is 0单击“ 确定”,将收到消息:
x is 10单击“确定”。
运行 Macro1,并收到以下消息:
the initialized value of x is 10单击“ 确定”,将收到以下消息:
x is 20单击“确定”。
消息中显示的值第二次不同,因为变量 x 声明为静态变量,并且变量在首次运行 Macro1 后保留其值。
注意: 如果有模块级变量,则其生存期与静态过程级变量相同。
若要验证模块级变量的生存期,请执行以下步骤:
1.
Change the code in the module that contains Macro1 to the following:
Dim x As Integer 'create a module-level variable
Sub Macro1()
MsgBox "the initialized value of x is " & x
x = x + 10
MsgBox "x is " & x
End Sub
运行 Macro1,将收到以下消息:
the initialized value of x is 0单击“确定”,将收到以下消息:
x is 10单击“确定”,
运行 Macro1,将收到以下消息:
the initialized value of x is 10单击“确定”。
收到以下消息:
x is 20单击“确定”。
消息中显示的值第二次不同,因为变量 x 声明为静态变量,并在第一次运行 Macro1 后保留其值。
重置项目以重置变量
如果要重置静态变量或模块级变量的值,请单击 上的“ 重置 ”按钮
Standard工具栏,或单击“运行”菜单上的“重置”。
如果为 Macro1 项目执行此操作,然后重新运行 Macro1,变量 x 的值将初始化回零,并且你会收到第一条消息:
the initialized value of x is 0