《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程,目前已经是第一版修订了。这套教程定位于最高级,是学完初级,中级后的教程。这部教程给大家讲解的内容有:跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互联网数据抓取、VBA延时操作,剪贴板应用、Split函数扩展、工作表信息与其他应用交互,FSO对象的利用、工作表及文件夹信息的获取、图形信息的获取以及定制工作表信息函数等等内容。程序文件通过32位和64位两种OFFICE系统测试。是非常抽象的,更具研究的价值。
教程共两册,二十个专题。今日分享内容是:VBA信息获取与处理第三个专题:VBA代码分类及如何利用代码自动关闭空闲文件【分享成果,随喜正能量】禅是静虑,要在静中思虑好歹,择善而从。精进勇猛,有大愿力,难的会变为易。疏散放逸,悠悠忽忽,不求进取,易的也变为难。。
专题三 VBA代码分类及如何利用代码自动关闭空闲文件大家好,我们这讲开始一个新的专题,这个专题中我们首先讲解一下VBA代码应用的模块(module),然后介绍给大家如何利用VBA代码实现已经打开文件的自动关闭。
我们要知道,模块是代码的容器。所有代码必须写在模块中才能执行。可以将模块看做为一个文件,实际上,我们确实可以将模块导出为一个文本文件。在一个模块中,可以包含几个过程。对于一个小的工程,可以将所有代码放在一个模块中。而对于大的、复杂的项目,可以将代码写在几个模块中,以利于组织和修改。在执行代码时,过程在哪个模块中并不重要。来自一个模块的代码可以调用同一项目中任何其他模块中的代码(注意所调用的过程作用域不是私有的Private)。
另外,我们也可以将一个模块文件,其文件名扩展名为.bas,类模块文件,其文件名扩展名为.cls或.frm(用于用户窗体)通过从VBA编辑器的“文件”菜单中选择“导入”项,将该模块导入到项目中。那么在VBA中代码又是如何进行分类呢?一般来讲,按模块分,代码的可以有四种类型:标准模块代码;工作簿和工作表模块代码;用户窗体模块代码;类模块代码。这个专题我将主要给大家介绍标准模块代码;工作簿和工作表模块代码的知识。对于窗体模块涉及到的内容类似于上述两个部分不再讲解,对于类模块大家可以参考我的专门教程“VBA中类模块的解读及应用”。
第一节 标准模块代码(Standard Code Modules)标准代码模块,是放置大部分VBA代码的地方。对于新手程序员,所有代码都会将在标准模块中。我们实现的绝大多数的功能也是在标准模块代码中完成的。这讲的内容就是给大家讲解标准模块代码。
1 标准模块代码的组成一个标准模块代码一般包含三个部分。第一个是编译器指令部分,位于模块的最顶部,它包含诸如Option Explicit和Option Compare Text之类的指令。但这些指令不是必需的,你可以根据自己的习惯在需要的时候使用它们。第二部分称为声明部分,可以声明了模块级或过程级范围的变量。这些变量可以由模块中的任何过程访问,并且即使在执行了一个过程或一组过程并修改了其值之后,这些变量仍保留其值。声明部分也可以包含声明引用函数。这些函数定义通常指向构成Windows操作系统的各种DLL文件中的函数。这些语句Sub、Function或Property过程之前。第三部分是模块中包含的实际代码。代码部分包含执行实际工作的所有代码。
上面的代码是本专题将利用的代码,这段代码没有包含上面讲解的第一部分,没有设置强制变量的声明及比较的模式等等,但包含上面讲解的第二部分,这部分声明了一个正常的Public变量:RunWhen,这个变量是在整个工程中有效的。还声明了一个常数的NUM_MINUTES,这个常数的意义就是我们将要经过多长时间让这个文件自动关闭。在上面的SUB过程就是我们前面提到的第三部分过程代码。
2 标准模块代码中的过程分类过程是可以作为一个单元执行的代码块。所有代码必须属于一个过程。代码不能存在于过程之外。虽然单个模块可以包含一定数量(<=1000)的单个过程,但通常最好将这些过程按相关功能分组为多个模块。这使得项目的组织更好,并可以让某个过程代码得到多次的调用。我们可以使用两种类型的过程。(实际上,有三种类型,但这里不讨论属性过程。)
第一个过程是SUB过程,这个过程可以自己运行,也可以被另一个过程调用,或者调用另外的过程。需要注意的是:sub过程不会向调用它的过程提供返回值,它只是执行,然后将程序运行的控制权再返回给调用它的过程。如果它没有被另一个过程调用,只是自己的运行,则终止代码执行。
第二个过程是函数Function过程,这个过程类似于SUB过程,只是函数可以将值返回给调用它的过程。函数通常将一个或多个参数作为输入,并将单个值返回给调用者,调用者的值取决于输入参数的值。我们来看看下面的的代码,SUB过程MYNZ调用函数过程CircleArea,将圆的半径传递给它。CircleArea函数接受此输入,进行简单计算,并将结果返回给调用方过程。
Sub MYNZ()
Dim Area As Double
Dim Radius As Double
Radius = 11
Area = CircleArea(Radius)
MsgBox "The area is: " & CStr(Area)
End Sub
Function CircleArea(Radius As Double) As Double
CircleArea = 3.14159 * (Radius ^ 2)
End Function
代码的截图:
上面的讲解中,无论是SUB过程还是Function过程,都是一个标准模块内的过程。
一个VBA程序工程可以包含任意多个标准代码模块。这使得您可以很容易地将您的过程划分为不同的模块,以便于组织和维护。例如,可以将所有数据库过程放在一个名为database的模块中,将所有数学过程放在另一个名为Math的模块中。只要过程没有Private关键字声明,模块没有标记为Private,就可以从任何其他模块调用,而无需执行任何特殊操作。
本节知识点回向:VBA中代码一般分为几类?标准模块代码一般分为几部分?SUB过程和
Function过程有什么不同?
我20多年的VBA实践经验,全部浓缩在下面的各个教程中,教程学习顺序: