本帖最后由 wbzxz 于 2011-4-6 10:16 编辑
引 言
这些天来我一直在这个问题上纠结,因为我虽然断断续续的学了近1年的VBA,但是我却很糊涂,也很肤浅(当然和我没有用心学有关,嘿嘿)。可能是因为最近对类模块问题的思考,渐渐的把我引导到这个问题上来,到底是什么问题呢,请看下图:
这是我们最熟悉VBE编辑器中的工程资源管理器。
我想问一个问题,这些是什么?当想到这个问题的时候,我觉得自己很可笑,因为图上写得很清楚,他们分别是Microsoft Excel对象,窗体,模块,类模块;但同时我又很糊涂,Sheet1不就是工作表对象吗?怎么还能在里面写代码呢?Range(“A1”)也是对象啊,怎么不能写代码呢?模块1也能写代码啊,模块1是不是对象啊?诸如此类的问题,把我搞的焦头烂额,完全可以说是一团浆糊,我突然感觉到自己对VBA那么陌生,因为我没有搞清楚这些基础问题,但这些基础问题好像微软没有给出我们系统的答案,我通过请教老师,翻阅资料,算是有了一点小小的理解,在这里和大家分享一下。
在此衷心感谢论坛的兰版、amule,吕布,HYY514等老师帮助,让我能从浆糊里面钻出来。
(一)什么是模块,VBA都包含什么模块呢?
首先我们来看微软VBA帮助中的三个定义:
模块:一组声明集合,其后为过程
声明:不可执行的代码,它命名一常数、变量或过程,并且指定其特性,比如数据类型。对于DLL procedures,声明指定名称、库和参数。
过程:命名的语句序列,可作为单元来执行。例如,Function、Property和 Sub 都是过程类型。总是在模块级别定义过程的名称,所有可执行的代码必须包含在过程内,一过程不能套在其它过程中。
通过这三个定义我们了解到了什么信息,我们平常写的代码是什么东西,对,就是声明和过程,也就是在Sheet1,Sheet2,Sheet3,ThisWorkbook,UserForm1,模块1,类1这些东西里面编写的代码,所以我们可以得出结论,Sheet1,Sheet2,Sheet3,ThisWorkbook,UserForm1,模块1,类1都是模块。
这些虽然都叫做模块,但是却有所不同,其实微软是这样分类的:(微软这样分类是有根据的,后面我们会找到依据的)
文档模块:Sheet1,Sheet2,Sheet3,ThisWorkbook
窗体模块:UserForm1 标准模块:模块1 类模块:类1
写到这里,有人可能会问,sheet1,sheet2这些本身就是微软为我们提供的内置对象,怎么能说是模块呢?诚然,在我们编写代码的过程中,它们确实是不同的对象。但是,由于微软单独把这些东西提取了出来,允许我们编写代码与这些对象进行关联,所以他们就具有了不同的意义,可以看作是微软自定义并已经嵌入的模块。由于我们能在他们内部编写并储存代码,所以,在这里,你就不要像看待range,cell等对象那样看待他们,而是要做为模块来看待他们。(这种思路的转变很重要,他们在这里我们是当作模块看待,而不是我们常用的对象)。
其实,作为VBA语言,来源于VB,所以他继承了VB语言的大部分功能,只不过微软单独为VBA提供了Excel对象(或者Word对象,PPt对象等等)。因为在VB中本身就提供了三种类型的模块:窗体模块、标准模块和类模块。所以VBA中就有了这三种模块。为了能够对Excel对象进行操作,微软又为我们提供了文档模块,而且是直接嵌入进来的(Sheet1,Sheet2,ThisWorkbook这些文档模块不需要我们插入,只要存在这个对象,就有这个文档模块)。所以,也就解释了,VBA为什么会有这四种模块。
我们通过上面的分析了解到了VBA的模块分为这四种,从什么地方可以看出微软是这样分类的呢,他们到底是不是对象(请一定和Excel模型中的Sheet1,Sheet2对象的概念分开,记住,在这里,他们已经是模块啦),他们到底是什么对象呢,大家请往下看。
|