楼主 杨开科 |
1.1 前言 一般人都不太可能记得住VBA中从多的函数或是其他一些特性,因而在VBA开发过程中,查阅帮助文档是很常见的事,灵活运用帮助文档这个强大的工具可使编程得心应手。然而,在某些方面,VBA的帮助文档又是难懂的,比如,变量的作用域,下面我们就来聊聊它吧。 1.2 了解范围与可见性 范围指的是变量、常数或过程被其它过程使用的可用性。有三个范围级别:过程的级别、私有模块级别和公共模块级别。 当声明一个变量时已决定了它的范围。将所有的变量做显示地声明是一个好主意,它可以避免不同范围中变量之间的命名冲突错误。 1.2.1 定义过程的级别范围 定义于程序内变量或常数是不能从过程外看到的。只有声明此变量的过程可以使用它们。在下面的示例中,第一个过程显示一个包含字符串的信息框。而第二个过程则显示一个空白的信息框,因为变量 strMsg 对于第一个程序是本地的。 ![]() 变量 strMsg的作用范围仅限于第一个过程,它不可被定义在此模块中的其他过程使用,更不能被其他模块中的任何过程使用。 注意:在过程内部只能用Dim关键字(Dim关键字不能省略)去声明作用于过程内部的变量,不可以使用Private 或Public关键字声明变量,也就是说Private 或Public关键字可出现于模块的声明部分,而不能在过程内部使用它们。 例如,运行下面的过程将产生编译错误。 ![]() 1.2.2 定义私有模块级别的范围 在模块的声明部分中,可以定义模块级别变量和常数。模块级别变量可以是私有或公有的。在工程中,公有变量对于所有模块中的所有过程是可用的;而私有变量只对于属模块中的过程是可用的。由 Dim 语句在声明部分中所声明变量,其范围的缺省值为私有。然而,若在变量的前面加上 Private 关键字,则其在代码中的范围将更为明显。 可以使用Private或Dim关键字声明一个私有变量。在下面的示例中,字符串变量 strMsg 可被定义在此模块中的任何过程使用。 当第二个过程被调用时,它会在对话框中显示出字符串变量 strMsg 的内容。 添加下面的到模块的声明部分,
![]() 当然,您需要选运行第一个过程对变量strMsg赋值。如果先运行第二个过程,由于此时变量strMsg尚未被赋值,它仍然显示一个空白的信息框。 插入一个模块,输入如图所示的代码,然后运行,将显示一个空白的信息框。因为在模块2中,Private strMsg As String 所定义的是一个模块级别的私有变量strMsg,此变量对于所属模块中的过程都是可用的,而对于其他模块中的过程是不可用的。 ![]() 模块级别中的私有变量可被所属模块中的其他过程改变,也可在同一过程内部多次改变。同样,定义于过程中的变量也可被多次改变,但不能被其他过程改变。对模块2中的代码稍加改变,依次运行第一个过程,第二个过程,再运行第三个过程,可见MsgBox所显示的内容变化情况。 ![]() 注意 公共过程若是在标准模块或对象类模块中的话,则任何引用工程都可以使用它。为了限制当前工程中模块内的所有过程,可以在模块的 声明部分加上 Option Private Module 语句。如此则公有变量和过程仍然可被当前工程中的其它过程所使用,但不能被引用工程所使用。 12.22.3 定义公共模块级别的范围 在上一节中说过,在模块的声明部分中,可以定义模块级别变量和常数。模块级别变量可以是私有或公有的。下面我们来学习如何在模块级别中声明公有变量。 可以使用Public关键字声明变量一个模块级别变量为公用,它将可被工程中的所有过程使用。在下面的示例中,字符串变量 strMsg 可被工程中模块的所有过程使用。 将以下部分包括在模块的声明部分中。
可以从引用的工程中,去使用它定义在标准模块或类模块中的公共过程、变量,以及常数。然而,必须先设置一个对它们所定义工程的引用。 公共过程、变量以及常数若不是定义在标准模块或类模块中,例如窗体模块或报表模块,都不可以被引用工程所使用,因为这些模块对于所驻留的工程而言是私有的。 今天就瞎聊到此吧!欢迎各位质证。 ![]() |
2楼 开心E点 |
感谢分享,学习 |
3楼 DJ_Soo |
公共过程、变量以及常数若不是定义在标准模块或类模块中,例如窗体模块或报表模块,都不可以被引用工程所使用,因为这些模块对于所驻留的工程而言是私有的。 这句是不全对的,窗体模块和报表模块中的也可以被引用甚至是赋值,借LZ思路刚简单写了个帖子: 标准模块如何与窗体模块和报表模块中的变量互通? http://www.exceltip.net/thread-34213-1-1.html |
4楼 杨开科 |
谢谢DJ_Soo 版主参与讨论,我的理解,变更可以在工程前传递,引用工程的方法是在VBE→“工具”→“引用”当中引用。 至少需要有两个工程才能从一个工程当中引用另一个工程。 放了一个例子 ![]()
|
5楼 杨开科 |
看看VBA帮助,有时真是不知所云,如: 引用的工程 当前工程。如何创建一到工程的链接,这要看主应用程序而定。例如,为在 Microsoft Excel 下直接引用工程,可在“工具”菜单的“引用”对话框中选定工程。直接引用的工程中的 Public 变量对直接引用的工程是可见的,但直接引用的工程中的Public 变量对直接引用的工程是不可见的。 |