ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 浅谈变量的作用域

浅谈变量的作用域

作者:绿色风 分类: 时间:2022-08-18 浏览:77
楼主
杨开科
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 的内容。
  添加下面的到模块的声明部分,
  
  1. Private strMsg As String
  2.   或
  3.   Dim strMsg As String
  它们的作用是一致的,因为由 Dim 语句在声明部分中所声明变量,其范围的缺省值为私有。然而,若在变量的前面加上 Private 关键字,则其在代码中的范围将更为明显。

 
  当然,您需要选运行第一个过程对变量strMsg赋值。如果先运行第二个过程,由于此时变量strMsg尚未被赋值,它仍然显示一个空白的信息框。
  插入一个模块,输入如图所示的代码,然后运行,将显示一个空白的信息框。因为在模块2中,Private strMsg As String 所定义的是一个模块级别的私有变量strMsg,此变量对于所属模块中的过程都是可用的,而对于其他模块中的过程是不可用的。

 
  模块级别中的私有变量可被所属模块中的其他过程改变,也可在同一过程内部多次改变。同样,定义于过程中的变量也可被多次改变,但不能被其他过程改变。对模块2中的代码稍加改变,依次运行第一个过程,第二个过程,再运行第三个过程,可见MsgBox所显示的内容变化情况。

 
  注意 公共过程若是在标准模块或对象类模块中的话,则任何引用工程都可以使用它。为了限制当前工程中模块内的所有过程,可以在模块的 声明部分加上 Option Private Module 语句。如此则公有变量和过程仍然可被当前工程中的其它过程所使用,但不能被引用工程所使用。

12.22.3 定义公共模块级别的范围
  在上一节中说过,在模块的声明部分中,可以定义模块级别变量和常数。模块级别变量可以是私有或公有的。下面我们来学习如何在模块级别中声明公有变量。
  可以使用Public关键字声明变量一个模块级别变量为公用,它将可被工程中的所有过程使用。在下面的示例中,字符串变量 strMsg 可被工程中模块的所有过程使用。
  将以下部分包括在模块的声明部分中。
  
  1. Public strMsg As String
  除了事件过程之外,所有过程的缺省值都是公共的。当 Visual Basic 创建一个事件过程时,在过程的声明前面会自动的加上 Private 关键字(如,Private Sub CommandButton1_Click (),Private Sub Workbook_Open()等事件)。对于其它的过程来说,若不想使它为公共的,必须利用 Private 关键字来显示地声明过程。
  可以从引用的工程中,去使用它定义在标准模块或类模块中的公共过程、变量,以及常数。然而,必须先设置一个对它们所定义工程的引用。
  公共过程、变量以及常数若不是定义在标准模块或类模块中,例如窗体模块或报表模块,都不可以被引用工程所使用,因为这些模块对于所驻留的工程而言是私有的。

  今天就瞎聊到此吧!欢迎各位质证。

浅谈变量的作用域.rar

2楼
开心E点
感谢分享,学习
3楼
DJ_Soo
公共过程、变量以及常数若不是定义在标准模块或类模块中,例如窗体模块或报表模块,都不可以被引用工程所使用,因为这些模块对于所驻留的工程而言是私有的。
这句是不全对的,窗体模块和报表模块中的也可以被引用甚至是赋值,借LZ思路刚简单写了个帖子:
标准模块如何与窗体模块和报表模块中的变量互通?
http://www.exceltip.net/thread-34213-1-1.html

4楼
杨开科
谢谢DJ_Soo 版主参与讨论,我的理解,变更可以在工程前传递,引用工程的方法是在VBE→“工具”→“引用”当中引用。
至少需要有两个工程才能从一个工程当中引用另一个工程。
放了一个例子

引用工程.rar
  1. Sub Main()
  2. '若将Public a As String放在工程MyProject_A中Sheet1报表模块,运行以下代码出现编译错误,而放在标准模块M1中则不会出错
  3. '将M1中的声明语句注释即可观察到结果
  4.     MsgBox MyProject_A.a
  5. End Sub
5楼
杨开科
看看VBA帮助,有时真是不知所云,如:
引用的工程
当前工程。如何创建一到工程的链接,这要看主应用程序而定。例如,为在 Microsoft Excel 下直接引用工程,可在“工具”菜单的“引用”对话框中选定工程。直接引用的工程中的 Public 变量对直接引用的工程是可见的,但直接引用的工程中的Public 变量对直接引用的工程是不可见的

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap