变量作用域分类
变量作用域分类
VBA 中,变量的作用域决定变量在哪里能被获取和使用。根据变量的声明位置和声明方式,变量的作用域从小到大有以下 3 种:
过程作用域
模块作用域
工程作用域
过程作用域
在过程或函数内部声明的变量,只有在当前过程或函数内被使用。例如:
Sub Test()
Dim name As String
Dim age As Integer
name = "张三"
age = 35
End Sub
它们只能在该过程中内使用,包括赋值和读取。如果尝试在外部和其他过程中直接使用它们,VBA 会提示变量未定义错误。
模块作用域
在一个模块中,在任何一个过程和函数外面,使用关键词 Private
或 Dim
声明的变量,称之为模块变量,其作用域是当前模块。
Dim guest As String //等同于private guest As String
Sub Test()
Dim message As String
guest = "张三"
message = "你好"
MsgBox message & "! " & guest
End Sub
Private
:将过程、变量或对象声明为 Private
时,它们只能在当前模块中访问和使用。其他模块无法直接访问或使用被声明为 Private
的成员。
Public
:将过程、变量或对象声明为 Public
时,它们可以在当前模块以及其他模块中访问和使用。其他模块可以直接引用并调用被声明为 Public
的成员。
工程作用域
Excel VBA 中,一个 Excel 工作簿是一个 VBA 工程。与之对应,工程作用域表示变量在当前工程中的模块、Excel 对象、用户窗体、类模块中均可以被使用。
工程级别变量,在所在模块顶部声明 Option Private Module
修饰语句前提下,在过程或函数外面,使用关键词 Public
声明的变量,其作用域是当前工程。
例如Module1 模块中的代码:
Public Sub Test()
Dim message As String
guest = "张三"
message = "你好"
MsgBox message & "! " & guest
End Sub
Module2 模块中的代码:
Sub CallPublicProcedure()
Module1.test ' 使用模块名(Module1)调用公共过程
End Sub
以上例子中,变量 guest
是使用 Public
关键词声明,是工程级别变量。它在当前工程中其他的模块中也能被使用。
Tips:当相同名称的变量,多次以不同的作用域声明时,出现作用域冲突。这种情况,VBA 会自动以就近原则使用变量,即优先使用最近定义的变量。
作者QQ4577105