VBA之Excel应用第五章第四节 变量的生命周期

《VBA之Excel应用》(版权10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非常容易的掌握相关的知识,这套教程共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家能掌握利用。今日讲解的内容是VBA之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

我20多年的VBA成果全在下面的资料中:

相关推荐
VBA63375 天前
VBA高级应用30例 应用6 第5部分:5 利用VBA从XML文件中导出数值数据
vba
VBA633713 天前
VBA信息获取与处理专题七第二节 网络通信过程的解读
vba
VBA633719 天前
数组与字典解决方案第二十九讲 数组的创建方法小结及回填的注意事项
vba
小妖6661 个月前
excel 怎么在单元格内容自动加上一段文字不能用公式
excel·vba
VBA63371 个月前
VBA之Word应用第五章第五节 Range对象的属性(四)
vba
VBA63371 个月前
VBA信息获取与处理专题七第一节 网络通信基础
vba
yivifu1 个月前
怎样将Word文档中脚注引用后面的空格轻松删除
word·vba
VBA63372 个月前
VBA中类的解读及应用第三十五讲 类对象的生死轮回----“二师兄”的成长历程之七
vba
SunnyDays10112 个月前
使用 C# 添加、修改和删除 Excel VBA 宏 (无需 Microsoft Office Interop)
c#·excel··vba