![be871794eef5eaa43465ac1b026bf065.png](https://img-blog.csdnimg.cn/img_convert/be871794eef5eaa43465ac1b026bf065.png)
大家好,今天继续讲解类和类模块应用,今日讲解第2讲内容:变量的作用范围(域)的详细解读。当你深入地学习VBA后,会发现VBA涉及到的内容非常之多,我们这讲讲解的是变量,在简单的VBA代码中你或许可以不必考虑变量的作用范围,但如果你做一个大型的程序,涉及到各个知识点的时候,必须要考虑变量的作用范围了。
变量因为声明的位置和方式不同,有着不同的作用范围,或者叫作用域。作用域是指变量在多大范围内能被代码识别。根据作用的范围不同,可以划分为过程级、模块级和全局变量。
一 过程级变量 在过程中声明,过程指的是一个Sub或Function,也包括后面提到的属性过程。通常用Dim或Static进行声明。
1 Dim声明的变量,只在该过程执行时存在,过程结束,变量的值也就消失了。
2 Static声明的变量称为静态变量,这个值在整个程序运行期间都存在。
理解其中的含义:
① [Dim]是动态变量,过程一旦结束,该变量所占有的内存就会被系统回收,而变量所储存的数据就会被破坏。
② [Static]是静态变量,这意味着在过程结束后这个变量所占有的内存不会被回收,数据当然也不会被破坏了,这样当你下次再调用该过程的时候,数据就依然存在。
二 模块级变量 对命名变量的整个模块所有过程都有效,对其它模块不可用。可以在模块顶部声明。
声明模块级变量用Private关键字和直接使用Dim没有区别。但推荐使用Private进行声明,这样可以与后面的全局变量区分开来。
三 全局变量 是对整个VBA工程的所有过程都有效的变量,使用Public关键字在标准模块的顶部来声明。
理解其中的含义:
① [Public]是公共变量,如果在一个模块当中使用,那么整个应用程序都能使用它所定义的变量,如果在类中使用,那么它就是一个共有属性。
② [Private]是私有变量,如果在一个模块中使用,那么只有这个模块才能访问到它所定义的变量,如果在类中使用,那么它就是一个私有属性。
本讲用到的测试代码:
Sub mynzclass2_1() '第2讲变量的作用范围
Dim K As Integer
Static ZZZ As Integer
K = K + 1
ZZZ = ZZZ + 1
VVV = VVV + 1
YYY = YYY + 1
MsgBox "过程变量K值为: " & K & Chr(10) & "过程级别静态变量ZZZ值为:" & ZZZ & Chr(10) & "全局变量VVV值为:" & VVV & Chr(10) & "模块变量YYY值为:" & YYY
End Sub
Sub mynzclass2_2() '第2讲变量的作用范围
Dim K As Integer
Static ZZZ As Integer
K = K + 1
ZZZ = ZZZ + 1
VVV = VVV + 1
YYY = YYY + 1
MsgBox "过程变量K值为: " & K & Chr(10) & "过程级别静态变量ZZZ值为:" & ZZZ & Chr(10) & "全局变量VVV值为:" & VVV & Chr(10) & "模块变量YYY值为:" & YYY
End Sub
Sub mynzclass2_3() '第2讲变量的作用范围
Dim K As Integer
Static ZZZ As Integer
K = K + 1
ZZZ = ZZZ + 1
VVV = VVV + 1
YYY = YYY + 1
MsgBox "过程变量K值为: " & K & Chr(10) & "过程级别静态变量ZZZ值为:" & ZZZ & Chr(10) & "全局变量VVV值为:" & VVV & Chr(10) & "模块变量YYY值为:" & YYY
End Sub
代码截图:在两个模块中我分别加入了过程Sub mynzclass2_1()Sub mynzclass2_2()Sub mynzclass2_3();同时在模块1的开始定义了全局变量VVV和模块变量YYY
![3006c40ee1dd35282ea8c0eda05376b8.png](https://img-blog.csdnimg.cn/img_convert/3006c40ee1dd35282ea8c0eda05376b8.png)
![e6c622f60e367efc23a34e85d59b742f.png](https://img-blog.csdnimg.cn/img_convert/e6c622f60e367efc23a34e85d59b742f.png)
这讲的内容比较有意思,下面我们看代码的运行:在工作表中,我分别给出了执行上述三个过程的按钮,我们每个按钮都执行一次看看结果:
![e9d22d3b2522e6ae939e92e79b6360d1.png](https://img-blog.csdnimg.cn/img_convert/e9d22d3b2522e6ae939e92e79b6360d1.png)
![645e9d7a25372ca32da41d7bb9d9453d.png](https://img-blog.csdnimg.cn/img_convert/645e9d7a25372ca32da41d7bb9d9453d.png)
![22c082e39f4957e2a57f2e42ae26c401.png](https://img-blog.csdnimg.cn/img_convert/22c082e39f4957e2a57f2e42ae26c401.png)
此时我们再次点击一下第一个按钮看看执行结果:
![4ea8bea1250c5a339707ac9df33359a8.png](https://img-blog.csdnimg.cn/img_convert/4ea8bea1250c5a339707ac9df33359a8.png)
我们仅对最后一次的结果进行分析:在最后一次点击按钮时,K是过程变量为1,ZZZ的内存中存在的
已经存在数值为1再加上1为2;VVV是全局变量这是第四次执行所以是4,yyy 是模块级别变量,由于在模块1中是执行的第三次操作,所以是3。
今日内容回向:
1 DIM StaticPublicPrivate 含义是否理解?
2 上面再次点击第三个按钮的结果,请分析。
![eb04d60ca0f20e9fcf5efa12556429e2.png](https://img-blog.csdnimg.cn/img_convert/eb04d60ca0f20e9fcf5efa12556429e2.png)