Excel VBA 编程 -- 作用域(四)
- 2026-09-16 11:51:25
Excel VBA 编程 -- 作用域(四)前面我们讨论了 VBA 变量的作用域以及与作用域相关的可见性和可访问性。与变量作用域有关的,还有一个概念,那就是生命期(lifetime)。 什么是变量的生命期(the lifetime of variables)?变量的生命期是指变量持有值的时间。在变量的生命期内,变量的值可能会不断变化,但总是持有自己的值。一旦超出变量的作用域,变量的生命期就结束了。 变量的作用域是指变量所能到达的“活动”范围,指的是变量的空间限度。变量的生命期是指变量所能到达的“生命”时长,指的是变量的时间限度。 一般来说,变量的空间限度和时间限度是一致的:超出变量的作用域,变量的生命期即终止。但也有不一致的时候:变量的生命期会超出其作用域! 例1. 变量的生命期示例 
图1 变量的生命期示例 这个例子中,过程 ScCode5Test 作为主控程序,循环调用 VarLifeTimeTest 过程。在过程 VarLifeTimeTest 中,用 Static 而不是 Dim 声明了一个本地变量 count,然后用 Dim 声明了一个同样的本地变量 k。从程序运行结果来看,变量 count 的值在过程 VarLifeTimeTest 调用之间是一直保持的,而变量 k 的值则是每次都重置。 这个例子演示了变量的作用域与生命期的两种情况: 这就是 Static 关键字的意义:所声明的变量是一种“静态”变量,并不随着作用域的结束而结束,只要有模块在运行,静态变量便一直持续存在(preserved)。也就是说,过程级的静态变量与模块变量有同样的生命期,但作用域是声明该静态变量的过程。因此,模块中的其他过程以及其他模块都不能访问该静态变量:虽然该静态变量如 count 存在,但对于其他过程,该变量不可见。 过程初次运行时,该过程内的静态变量被初始化: 如果静态变量在过程运行期间没有被赋予其他的值,则将一直保持被初始化的值。 Static 类型声明只对于过程级的变量有意义,模块级和项目级的变量,其生命期都与模块/项目一致,随意不需要 Static 声明。 Static 可以代替 Dim,声明个别静态变量,也可以位于 Sub/Function 之前,将 Sub/Function 中所有的过程级变量都声明为静态变量。 下面来看一个例子。 例2. 批量 Static 声明 
图2 批量 Static 声明 过程 VarLifeTimeTest2 与前面的 VarLifeTimeTest 基本一样,唯一的区别是 Sub 前面冠以了 Static 关键字。由程序运行结果来看,使用 Dim 声明的本地变量 k 也变成了静态变量。 这就是 Static 关键字的灵活之处: 明白了 Static 的“威力”,就要小心使用。因为静态变量在整个程序运行起见都存在,如果静态变量特别是结构型静态变量过多的话,对程序的性能会有一定的影响。 所以,尽量在过程内部使用 Static 以声明特别需要的个别静态变量。 相关阅读 Excel VBA 编程 -- 作用域(一) Excel VBA 编程 -- 作用域(二) Excel VBA 编程 -- 作用域(三)

变量 k 的作用域与生命期是一致的。k 的作用域就是过程 VarLifeTimeTest,该过程运行时,k 获得“生命”,该过程结束,k 的作用域也结束,因而其声明也结束了。 变量 count 的作用域与生命期是不一致的。count 的作用域同 k 一样,也是过程 VarLifeTimeTest,但生命期与 k 不一样:该过程初次运行时,count 获得“生命”,但 count 的生命并不随着 VarLifeTimeTest 过程的结束而结束,而是在过程结束之后,count “潜伏”下来,等到下次过程运行时,count 重新激活,以“潜伏”时的值参与 count = count + 1 赋值语句。因此,count 的值在过程运行之间被“留置”(retained)。
数值型变量被初始化为 0。 Boolean 类型的变量被初始化为 False。 可变长字符串被初始化为空字符串,定长字符串被 Chr(0) 字符填充。 Variant 类型的变量被初始化为 Empty。 对象类型的变量被初始化为 Nothing。 用户自定义类型的变量,其成员按照以上的规则被相应地初始化。

用在过程内部,可以将个别变量声明为静态变量; 用在 Sub/Function 之前,则将 Sub/Function 内部所有的本地变量都声明为静态变量。
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。