首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

变量的生命周期

今日的内容是“VBA之EXCEL应用”的第五章“变量的类型及应用”中第四节“变量的生命周期”。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,案例众多。大家可以非常容易的掌握相关的知识,这套教程面向初学人员,共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家能掌握利用。

第四节 变量的生命周期

大家看到今日这讲的题目可能会有一定的疑问:变量也有生命吗?关于这个问题,我在另一套教程《VBA中类的解读和应用》中有详细的论述,这里只是简单的讲解。生命的意义对于不同的事物也是不同的,对于变量而言,它的生命周期就是从开始占用内存开始,一直持续到内存的释放,这就是我们常讲的生死过程。

1 理解变量的生命周期

变量保留其值的时间被称为变量的生命周期。当变量失去自己的作用域时,它不再具有值。

在过程开始运行时,会初始化所有变量。数值变量初始化为零, 可变长度字符串初始化为零长度字符串(""), 固定长度的字符串用ASCII字符代码0或Chr(0)表示的字符填充。 Variant变量初始化为空。用户定义类型变量的每个元素都像单独变量一样初始化。在声明对象变量时,会在内存中保留空间,但其值设置为Nothing,直到使用set语句为其分配对象引用。如果变量的值在代码运行期间未更改,它会保留其初始化的值,直到失去自己的作用域。

使用Dim语句声明的过程级变量保留一个值,直到该过程完成运行为止。如果该过程调用其他过程,当其他过程运行时,该变量也会保留其值。所以过程级的变量生命周期一般就是过程的开始到过程的结束。

如果过程级变量是使用Static(静态变量)关键字声明的, 则只要在任何模块中运行代码, 该变量就会保留其值。当所有代码都运行完毕时,变量将失去自己的作用域和值。其生命周期与模块级别变量相同。

模块级别变量与静态变量不同。在标准模块或类模块中,它保留其值,直到代码停止运行。在类模块中,只要类的实例存在,变量便会保留其值。模块级别变量将一直消耗内存资源,直到重置其值,因此请仅在必要时使用这些变量。也就是说,模块级别变量的生命周期是代码的运行开始到代码的运行结束。

如果在Sub或Function语句之前包括Static关键字, 则在两次调用之间将保留过程中所有过程级别变量的值。

2 过程级变量的生命周期

对于上述的介绍,大家或许不是很理解,这里我再就一些例子来说明一下,大家只要理解了代码运行结果就可以了。我们看下面的代码:

Sub mynzL()’过程级变量的生命周期

Dim X As Integer

X = X + 1

MsgBox "X的值为:" & X

End Sub

代码讲解:

对于上述过程,变量X是一个过程级别的变量,因为他声明在mynzL这个过程中,那么这个变量什么时间开始有自己的生命呢?就是在DIM语句声明开始,这个时候开始占用了内存,在代码的执行过程中,这个值变成了1。那么什么时候这个生命变量的生命周期结束呢?就是过程mynzL结束的时候。

3 模块级变量的生命周期

我们看下面的代码:

Private myMk As Integer

Sub mynzM() '模块级变量的生命周期1

myMk = myMk + 10

MsgBox "运行OK"

End Sub

Sub mynzN() '模块级变量的生命周期2

MsgBox "myMk的值为:" & myMk

End Sub

代码解读:

我们在模块的头部声明了一个模块级别的私有变量myMk,这个变量的生命周期就是这个模块开始运行的时候。一旦我们开始运行了这个模块5,这个变量就将被初始化到内存中,我们点击:

先运行mynzN这个过程:

此时我们看到myMk的初始值为0,我们点击mynzM的运行按钮两次,再次点击mynzN的运行按钮:

这个时候myMk变量的值就变成了20,说明模块级别的变量生命一直是存在的,当我们关闭这个工作簿时,它的生命周期也就结束了。

4 静态变量(Static)的生命周期

在上述讲解中,我们了解到:静态变量(Static)在过程级使用, 用于声明变量和分配存储空间。在 Static 语句内声明的变量会在代码运行时一直保留其值。在模块代码运行后,使用Static语句声明的变量将保留其值,直到重置或重新启动模块为止。在类模块中,使用 Static 语句声明的变量会在每个类实例中保留其值,直到实例被销毁。在窗体模块中,静态变量会在窗体关闭前一直保留其值。

在过程中使用Static语句声明的变量只在这个过程中生命一直存在,但这些变量的生命周期与模块相同。

我们看下面的代码:

Sub mynzO() '静态变量的生命周期1

Static myJT As Integer

myJT = myJT + 1

MsgBox "myJT的值为:" & myJT

End Sub

Sub mynzP() '静态变量的生命周期2

MsgBox "myJT的值为:" & myJT

End Sub

代码解析:

上面的两个过程 mynzO和 mynzP中,我们在 mynzO中声明了一个静态变量myJT,我们点击两次mynzO的运行按钮:

结果显示myJT变量的值是2,这说明这个变量在过程结束后没有失去生命。我们点击mynzP的运行按钮:

结果显示这个时候的变量myJT没有传递到mynzP过程之中。那么这个变量的生命周期什么时候结束呢?就是工作簿关闭的时候。

另外,对于公用级别的变量这里就不再讨论了,大家可以根据上述的思路自己理解。

今日内容回向:

1) 过程级别变量的生命周期如何理解?

2) 模块级别变量的生命周期如何理解?

3) 静态变量的生命周期如何理解?

本讲内容参考程序文件:工作簿05.xlsm

分享成果,随喜正能量

VBA的应用范围及学习方法:

VBA是利用Office实现个人小型办公自动化的有效手段(工具)。这是我对VBA的应用界定。在取代OFFICE新的办公软件没有到来之前,谁能在数据处理方面做到极致,谁就是王者。其中登峰至极的技能非VBA莫属!

我记得20年前自己初学VBA时,那时的资料甚少,只能看源码自己琢磨,真的很难。20年过去了,为了不让学习VBA的朋友重复我之前的经历,我根据自己多年VBA实际利用经验,推出了七部VBA专门教程。

第一套:VBA代码解决方案  是VBA中各个知识点的讲解,教程共147讲,覆盖绝大多数的VBA知识点,提供的程序文件更是一座不可多得的代码宝库,是初学及中级人员必备教程;目前这套教程提供的版本是修订第二版,程序文件通过32位和64位两种OFFICE系统测试。

第二套:VBA数据库解决方案  数据库是数据处理的专业利器,教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法和实例操作,适合中级人员的学习。目前这套教程提供的是修订第一版教程,程序文件通过32位和64位两种OFFICE系统测试。

第三套:VBA数组与字典解决方案   数组和字典是VBA的精华,字典是VBA代码水平提高的有效手段,值得深入的学习,是初级及中级人员代码精进的手段。目前这套教程提供的版本是修订第一版,程序文件通过32位和64位两种OFFICE系统测试。

第四套:VBA代码解决方案之视频  是专门面向初学者的视频讲解,可以快速入门,更快的掌握这门技能。这套教程是第一套教程(修订一版)的视频讲解,视频更易接受。

第五套:VBA中类的解读和利用这是一部高级教程,讲解类的虚无与肉身的度化,类的利用虽然较少,但仔细的学习可以促进自己VBA理论的提高。这套教程的领会主要是读者的领悟了,领悟一种佛学的哲理。目前这套教程提供的版本是修订第一版,程序文件通过32位和64位两种OFFICE系统测试。

第六套教程:VBA信息获取与处理,这是一部高级教程,涉及范围更广,实用性更强,面向中高级人员。教程共二十个专题,包括:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪切板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。

第七套教程:VBA之EXCEL应用  这是一部初级教程这部教程共三册,从从创建宏、对话框、工作簿和工作表对象、单元格对象等基础内容讲起,到循环结构、错误处理、字符串操作、日期和时间、事件、数组应用,函数过程等方面,一直讲解到控件和窗体对象的应用都是我们提高自己EXCEL水平的必须。

以上各教程学习顺序:71(或者4)3265。其中第四套是对第一套的视频讲解,所以第一和第四只选其一即可。可以W.e.C.h.a.t : VBA6337。

_______________________________

有启发 点在看 朋友分享

约作者 请留言 直接交流

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210111A0COSI00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券