《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,二十个专题。今日分享内容是:VBA信息获取与处理第三个专题第二节:工作簿和工作表模块代码(Workbook And Sheet Modules)
【分享成果,随喜正能量】如果我们真的有在平时认真的去修行,随着我们的修行时间的变化我们自己的你相貌也会随之改变的,风度变了、仪态变了,会和从前大不一样的,在现代这个定义应该是体质的变化,你功夫越得力你会发现过去有些毛病,现在毛病没有了;从前精神常常提不起来,现在精神饱满、容光焕发。。
专题三VBA代码分类及如何利用代码自动关闭空闲文件
大家好,我们这讲开始一个新的专题,这个专题中我们首先讲解一下VBA代码应用的模块(module),然后介绍给大家如何利用VBA代码实现已经打开文件的自动关闭。
我们要知道,模块是代码的容器。所有代码必须写在模块中才能执行。可以将模块看做为一个文件,实际上,我们确实可以将模块导出为一个文本文件。在一个模块中,可以包含几个过程。对于一个小的工程,可以将所有代码放在一个模块中。而对于大的、复杂的项目,可以将代码写在几个模块中,以利于组织和修改。在执行代码时,过程在哪个模块中并不重要。来自一个模块的代码可以调用同一项目中任何其他模块中的代码(注意所调用的过程作用域不是私有的Private)。
另外,我们也可以将一个模块文件,其文件名扩展名为.bas,类模块文件,其文件名扩展名为.cls或.frm(用于用户窗体)通过从VBA编辑器的“文件”菜单中选择“导入”项,将该模块导入到项目中。那么在VBA中代码又是如何进行分类呢?一般来讲,按模块分,代码的可以有四种类型:标准模块代码;工作簿和工作表模块代码;用户窗体模块代码;类模块代码。这个专题我将主要给大家介绍标准模块代码;工作簿和工作表模块代码的知识。对于窗体模块涉及到的内容类似于上述两个部分不再讲解,对于类模块大家可以参考我的专门教程“VBA中类模块的解读及应用”。
第二节 工作簿和工作表模块代码(Workbook And Sheet Modules)
工作簿和工作表模块是直接绑定到工作簿对象和每个工作表对象的特殊模块。工作簿的模块称为ThisWorkbook,每个工作表模块的名称与其所属工作表的名称相同。这些模块应该包含对象的事件过程,仅此而已。如果将事件过程放在标准代码模块中,Excel将找不到它们,因此不会执行它们。如果将普通过程放在工作簿或工作表模块中,则在不完全限定引用的情况下无法调用它们。
1工作簿和工作表对象的名称的获得
工作簿和工作表模块有一个名为CodeName的属性,这是VBA内部了解对象的方式。默认情况下,工作簿代码名为ThisWorkbook,对于工作表,每个工作表模块都是Sheet1、Sheet2等,对于图表,则是Chart1、Chart2等。在VBA代码中可以像使用普通变量一样使用这些名称。例如:
Sub MYNZA()
MsgBox ThisWorkbook.Name
MsgBox Sheet1.Name
End Sub
代码运行结果:
这很有用,因此您可以始终引用工作表,例如,即使用户从Excel重命名工作表。例如,如果有一个名为“Sheet1”的工作表,则其名称和代码名都将为Sheet1。但如果用户将工作表重命名为MySheet,则代码
Msgbox Worksheets("Sheet1").Name
将失败,因为不再有名为Sheet1的工作表。但是,代码
Msgbox Sheet1.Name
将继续工作,因为VBA仍通过其代码名Sheet1知道该工作表。
2 工作簿和工作表对象的重命名
在上面的讲解中我们了解到:工作簿的模块称为ThisWorkbook,每个工作表模块的名称与其所属工作表的名称相同。那么是否可以更改这个名称呢?
可以更改ThisWorkbook或Sheet对象的代码名。若要更改模块的代码名,可在“项目资源管理器”窗口中选择该模块,然后打开“属性”窗口(F4或从“视图”菜单中),更改“名称”属性。这里需要注意一点如果在这些模块中已经有了代码之后再执行此操作,可能会遇到问题。下面结合两个例子来说明:
a 更改ThisWorkbook对象的代码名,这时ThisWorkbook将继续引用工作簿对象。例如,如果将ThisWorkbook对象的代码名更改为MyWorkbook,则以下两行代码都将工作:
Sub MYNZB()
'更改名称ThisWorkbook为MyWorkbook
MsgBox ThisWorkbook.Name
MsgBox MYWORKBOOK.Name
End Sub
代码截图:
代码的运行:
b 如果将Sheet1对象的代码名更改为MySheet1,由于不再有代号为Sheet1的工作表对象,则以下代码将失败
Sub mynzc()
MsgBox Sheet1.Name
End Sub
代码截图:
运行结果:
c 此外,还可以使用VBA过程更改对象的代码名。例如:要将代码名为Sheet1的工作表的代码名更改为NewCodeName,请使用
ThisWorkbook.VBProject.VBComponents("Sheet1").Name= "NewCodeName"
要将MyWorkbook代码名改为NewWBName可以使用下面代码:
ThisWorkbook.VBProject.VBComponents("MyWorkbook").Name = "NewWBName"
全部代码如下:
Sub mynzd()
'ThisWorkbook.VBProject.VBComponents("Sheet1").Name = "NewCodeName"
ThisWorkbook.VBProject.VBComponents("NewCodeName").Name = "Sheet1"
End Sub
代码截图:
运行结果:
大家要注意上面的操作,可能会导致很多问题,所以除非我们事先知道自己在做什么,而且必须要做这种更改,否则不要进行这样的操作。
例如:当我们更改ThisWorkbook对象的代码名,下面的代码:
Msgbox ThisWorkbook.Name 将继续工作,但
Msgbox ThisWorkbook.VBProject.VBComponents("ThisWorkbook").Name
将失败,因为没有代码名为ThisWorkbook的对象,除非有一个ThisWorkbook的对象在对象浏览器中存在。
本节知识点回向:工作薄和工作表模块有什么特点?如何更改他们的名称?更改名称时要注意哪些问题?
本节内容详细代码“参考003工作表.XLSM”
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序: