分享

零基础学VBA编程第07课:什么是变量作用域?

 H0ing 2020-01-27
原创 EH看见星光 Excel星球 

HI~大家好,我是星光,今天咱们来继续学习VBA编程。在上一课咱们讲了什么是变量;这一课再来讲一下什么是变量的作用域以及如何释放变量。

打个响指,先来看第一个问题,什么是变量的作用域。域是地域,是一种空间范围,所谓作用域,顾名思义也就是变量作用的范围。

如果你看过前面的章节,想必已经知道工程资源管理器包含了多个对象……

工作表、工作簿、窗体、标准模块、类模块等,每一个对象都有自己的代码窗口,代码窗口内可以编写VBA代码,也就是过程。这样一来我们就拥有了三层空间。工程->模块(包含了标准模块和其它对象)->过程

与之相对应,变量的作用域也就同样被划分为了三层,过程级变量,模块级变量和工程级变量。变量的作用域决定了可以在哪个范围内使用相关变量;其中过程级变量又被称为本地变量,最为常用。



本地变量


在一个过程中使用Dim语句
声明变量,即为本地变量。本地变量只作用于本过程,其它过程无法调用它。

举个栗子。

Option Explicit '强制声明变量
Sub test1() '过程1    Dim i As Long    i = 99End Sub
Sub test2() '过程2    MsgBox "看见星光的期末成绩是:" & iEnd Sub

代码解析▼

第一行代码是
Option Explicit语句,作用是强制要求该模块内的变量必须声明,未声明的变量不能编译使用

运行第1个过程声明变量i,并
赋值为99。然后再运行第2个过程,此时系统会弹出消息框:编译错误、变量未定义。这是由于在第2个过程中,我们并没有声明变量i;变量i只作用于过程1,过程2无法继续使用它。


……除了使用Dim语句外,也可以使用Static语句定义本地变量。不过这语句极少用,少用到使用它就沦为奇葩没有说的地步,捂脸,所以咱们就当它不存在。

使用Static语句声明的本地变量不会随过程的结束自动释放▼
Sub test3()    Static i As Long 'Static语句声明本地变量    i = 999    MsgBox iEnd Sub


模块级变量


本地变量只能在单个过程中使用,如果你需要在
一个模块内的多个过程中使用同一个变量,可以将该变量定义为模块级变量(又被称为私有变量)。这需要在模块内第一个过程前使用Dim或者Private语句进行定义。

照例举个栗子。

定义模块级变量..
Option Explicit '强制声明变量。
Dim i As Long 'Dim语句定义模块级变量Private s As String 'Private语句定义模块级变量
Sub test1() '过程1 i = 18 '赋值变量i s = "听歌" '赋值变量sEnd Sub
Sub test2() '过程2 MsgBox "看见星光年龄:" & i & vbCrLf _ & "特长:" & sEnd Sub


代码解析▼

第1行代码是
Option Explicit语句,强制要求该模块内的变量必须声明,未声明的变量不能编译使用

第3行代码使用Dim语句定义变量i;第4行代码使用Pravite语句定义变量s——这里这两个语句没啥不同,都是定义模块级变量,你喜欢谁就用谁,开心就好。

先运行第一个过程,为两个变量赋值;然后运行第2个过程。由于两个过程均为模块级变量,模块内是通用的;第1个过程变量的赋值结果,在第2个过程依然有效,因此第2个过程返回消息框内容如下。

小小的门口还有她的问候..


想一下,如果没有先运行过程1,而是直接运行过程2,结果会怎么样?为什么?

没有广告的微信文是不热情的..

工程级变量

模块级变量只能在一个模块中使用,如果你需要在多个模块内调用同一个变量,可以将该变量声明为工程级变量(又被称为公共变量、全局变量等)。这需要在模块内第一个过程前使用Public语句进行定义。


举一个简单的例子,详细的例子放在窗体交互部分再说。

第1步▼

使用以下语句在模块3定义了一个公共变量strName,并运行过程为其赋值为"看见星光"。

Option Explicit
Public strName As String '声明公共变量
Sub test6()    strName = "看见星光" '变量赋值End Sub

在模块3声明一个公共变量并赋值..

第2步▼

在另一个模块4运行以下代码:

Sub test8()    MsgBox "人帅而不自知:" & strNameEnd Sub


此时在模块4和其过程中,我们既没有声明变量strName,也没有为其赋值;但由于在模块3中声明的变量strName为公共变量,因此在该工作簿工程内所有模块均有效,运行上述过程
test8返回结果如下。



总结



打个响指,总结一下,变量的作用域是指变量可以调用的范围,分为三类,本地变量、模块变量和公共变量。定义不同类型的变量语句不同、存放的位置也不相同。如下表所示。
   变量定义方式和作用域..

如何释放变量


在前面的章节我们讲过,变量是储存数据的容器,是内存里一个小盒子。我们使用变量,当然会占用内存空间。如果变量用完了,却依然占据大量内存,这就不对了……搓搓手,大喇叭广播一下,同志们呐,有几句俗话说的好啊,多一分自觉、多一份清洁;和谐城市是我家,美丽环境靠大家;一纸一屑煞风景,一举一动显文明,及时释放变量,美丽城市文明你我她……

……是的,释放变量可以清空变量所占据的内存空间,将新的空间提供给其它任务,可以提高代码运行效率——那么如何释放变量呢?

变量释放有两种方式,一种是人工释放,一种是自动释放;
大部分情况下系统都会自动释放变量。比如过程级变量,在过程执行完成后,绝大部分也就自动消失了……至于极少变量不会自动释放问题,后面我们用到时再说。


模块级和工程级变量在赋值完成后,只要工作簿未关闭,便会一直存在。如果需要一次性
全部释放,可以使用End语句。

END语句可以释放所有的变量
了解一下就好,极少用..


不管是过程级变量还是模块、工程级变量,在工作簿关闭后都会自动释放。

……

小喇叭:除了汗水,什么都不要带走;除了脚印和钱,什么都不要留下。我是星光,挥手下期再贱。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多