ARTICLE · 998262
Excel VBA 编程 -- 作用域(三)
Excel VBA 编程 -- 作用域(三)订正一个不准确的说法。 前文说 VBA ”没有如 C# 语言中的程序集(assembly)设施,所以,没有办法声明只用于项目内部的变量“,这个说法不准确。 VBA 确实没有类似 C# 的程序集(assembly)设施,但却有声明”只用于项目内部变量“的能力。 我们说过,VBA 的 Public 和 Private 声明语句可以声明模块公有变量和模块私有变量,模块私有变量只能用于本模块,模块公有变量可以用于本项目的所有模块,也可以用于其他项目的所有模块。如果要声明只用于本项目各模块的变量,需要使用 Option 语句。如下所示: 如上声明的变量 pName 就是一个“项目私有”的变量,即只能用于该声明语句所在的项目,其他项目,即使引用了此项目,pName 也是不可见的。下面看一个例子。 例1. 项目私有变量示例 
图1 声明“项目私有”变量 我们在项目 PiVBALib 中添加一个模块 vModule,在此模块顶部用 Option Private Module 声明此模块中的 Public 变量均为“项目私有”变量。然后使用 Public 语句声明一个 pName 变量。则此变量只能用在 PiVBALib 项目中。 
图2 使用“项目私有”变量 在项目 PiVBALib 中的 pModule 模块,我们定义了一个 ProjectPrivateTest 过程,用来测试前面声明的 pName 变量。如果 ProjectPrivateTest 过程能正确运行,则说明 pName 变量可以用在 PiVBALib 项目的各个模块中。 
图3 测试项目级变量 gName 和 ProjectPrivateTest 过程 现在转到我们的当前项目(ExcelVBAScope),在 ScCode4 模块中,我们定义了一个 VarTest 过程,用来测试前面声明的变量。 根据右侧立即窗口的输出结果,我们知道,PiVBALib 项目中的公有变量 gName 是可以在 ExcelVBAScope 项目中访问的,另外,过程 ProjectPrivateTest 也能够正确运行,说明 pName 变量在 PiVBALib 项目中可以正常访问。 下面我们来访问 pName。 
图4 访问“项目私有”变量 由图可见,编译器在遇到变量 pName 时,抛出错误“变量未定义”,说明编译器找不到名为 pName 的变量,那就说明,PiVBALib 中的“项目私有”变量 pName 在 ExcelVBAScope 项目中不可见,也就是说,项目 ExcelVBAScope 中的代码不能访问 PiVBALib 中的“项目私有”变量 pName! 现在,我们可以把 VBA 中可以声明的变量作用域类型列表如下: 
表1 VBA 变量作用域类型 相关阅读 Excel VBA 编程 -- 作用域(一) Excel VBA 编程 -- 作用域(二)
Option Private ModulePublic pName As String ' pName 只能用于当前项目




