vba定义类_VBA|⼯程中的四类模块的具体含义与⽐较新建⼀个⼯作簿后的VBE的⼯程资源管理器:
可以看到默认的3个⼯作表对应的模块和⼯作簿模块ThisWorkbook。
选择sheet1,点击“对象”列表下拉框:
可以看到⼀个可供选择的Worksheet对象。
选择该对象,将⾃动建⽴事件代码框架,在右边的“事件”列表中有与对象相关的事件可供选择:
⼯作簿对象也中如此:
在“插⼊”菜单可以插⼊三类模块:⽤户窗体、模块、类模块。
⽤户窗体是与⽤户交互的图形界⾯,窗体本⾝和插⼊的控件都是⼀个对象:
类模块⽤于⽤户⾃定义类和对象:
当我们录制⼀个宏时,会⾃动在⼯程资源管理器中插⼊⼀个模块,默认的名称是“模块1“,这是⼀种标准模块,不与具体的⼯作表、⼯作簿、窗体相关联:
这就是VBA中的四类模块:“标准模块”、Microsoft Excel⼯作簿和⼯作表对象、窗体、类模块。
模块就是⼀组声明和过程。
声明:不可执⾏的代码,它命名⼀常数、变量或过程,并且指定其特性,⽐如数据类型。对于DLLprocedures,声明指定名称、库和参数。
过程:命名的语句序列,可作为单元来执⾏。例如,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对python和vb的代码可以通用吗
象等等)。因为在VB中本⾝就提供了三种类型的模块:窗体模块、标准模块和类模块。所以VBA中就有了这三种模块。为了能够对Excel对
象进⾏操作,微软⼜为我们提供了⽂档模块,⽽且是直接嵌⼊进来的(Sheet1、Sheet2、ThisWorkbook这些⽂档模块不需要我们插⼊,
只要存在这个对象,就有这个⽂档模块)。所以,也就解释了,VBA为什么会有这四种模块。
我们通过上⾯的分析了解到了VBA的模块分为这四种,从什么地⽅可以看出微软是这样分类的呢,他们到底是不是对象(请⼀定和Excel模型
中的Sheet1、Sheet2对象的概念分开,记住,在这⾥,他们已经是模块啦),他们到底是什么对象呢?
从VBE资源管理器我们看出Microsoft Excel对象(⽂档模块)、窗体(窗体模块)、模块(标准模块)、类模块这些模块都在什么下边呢,对,都
在在VBA Project的下⾯:
VBA Project是什么呢,就是我们平常说得⼯程,实际上他是VBA Project对象,他下⾯的这些Microsoft Excel对象(⽂档模块)、窗体(窗
体模块)、模块(标准模块)、类模块也都是对象,是什么对象呢,VB Component对象。现在可以告诉你,这些模块就是对象,是叫做VB Component的对象。
为了说明这个问题,需要引⼊⼀个概念,VBA扩展模型(VBA Extensibility Model),他具有对VBA⼯程和模块进⾏操作的功能:
(1)⽤代码添加和删除VBA模块(⽽不是⼿动插⼊和删除);
(2)⽤代码去创建代码(说起来有点绕,应该是⽤代码建⽴个模块,然后⽤代码在模块⾥⾯写代码);
(3)创建⽤户窗体;
VBA扩展模型的简单层次结构是这样(只为说明问题,没有全部列出来):
VBE
VB Project
VB Component
Code Module
Designer
Property
Reference
Window
CommandBar
其实VB Project对象就是我们在⼯程资源管理器经常看到的,下⾯的Sheet1、Sheet2、Sheet3、ThisWorkbook、UserForm1、模块
1、类1就是VB Component对象。在这⾥我们得出了⼀个结论:⽂档模块、标准模块、类模块、窗体模块是对象,⼀种叫做VB
Component的对象
VBComponent对象有个type属性,清楚的告诉了我们Sheet1、Sheet2、Sheet3、ThisWorkbook、UserForm1、模块1、类1分别属
于什么模块,也就是上⾯所说的,微软是怎么对这些模块进⾏分类的呢,也就是type属性来告诉了我们这个问题。
我们⽤以下代码来展⽰这些模块都属于哪些类型。
Sub test()Dim VBComps As VBComponents ‘定义VBComponents类的对象变量Dim VBComp As VBComponent ‘定义VBComponent类的对象变量‘这⾥我们借⽤了T
通过代码的运⾏,我们发现Sheet1、Sheet2、Sheet3、Thisworkbook是⼀种类型,部件常数的值是100。
模块1是⼀种类型,部件常数的值是1;
类1是⼀种类型,部件常数的值是2;
UserForm1是⼀种类型,部件常数的值是3;
通过上⾯的叙述,总结起来只是⼀句话:
⽂档模块、标准模块、类模块、窗体模块是对象,并且都是⼀个叫做VBComponent的对象,根据VBComponent属性"type"(类型)的不同,微软把他们分为了4类:Vbext_ct_StdModule、Vbext_ct_ClassModule、Vbext_ct_MSForm、Vbext_ct_Document。
VB的代码存储在模块中。在VB中提供了三种类型的模块:窗体模块、标准模块和类模块。
简单的应⽤程序可以只有⼀个窗体,所⽤的程序都驻留在窗体模块中,⽽当应⽤程序庞⼤复杂时,就要另外附加窗体。最终可能有⼏个窗体中有⼀些共同都要执⾏的代码,为了在两个窗体中不产⽣重复代码,可创建⼀个独⽴的模块,⽤它实现代码公⽤。该独⽴模块即是标准模块。此外还可以建⽴包含共享代码与数据的类模块。
1 窗体模块
由于VB是⾯向对象的应⽤程序开发⼯具,所以应⽤程序的代码结构就是该程序在屏幕上表⽰的对应模型。根据定义,对象包含数据和代码。应⽤程序中的每个窗体都有⼀个相对应的窗体模块(⽂件扩展名为.frm)
窗体模块是VB应⽤程序的基础。窗体模块可以包含处理事件的过程、通⽤过程以及变量、常数、⾃定义类型和外部过程的窗体级声明。写⼊窗体模块的代码是该窗体所属的具体应⽤程序专⽤的;也可以引⽤该程序内的其它窗体和对象
每个窗体模块都包含事件过程,在事件过程中有为响应该事件⽽执⾏的程序段。窗体可包含控件。在窗体模块中,对窗体上的每个控件都有⼀个对应的事件过程集。除了事件过程,窗体模块还可包含通⽤过程,它对来⾃该窗体中任何事件过程的调⽤都作出响应。
2 标准模块
标准模块是程序中的⼀个独⽴容器,包含全局变量、Function(函数)过程和Sub过程(⼦过程)。
可将那些与特定窗体或控件⽆关的代码放⼊标准模块中。标准模块中包含应⽤程序内的允许其它模块访问的过程和声明。它们可以包含变量、常数、类型、外部过程和全局声明或模块级声明。
3 类模块
在VB中类模块是⾯向对象编程的基础。可以在类模块中编写代码建⽴新对象。这些新对象可以包含⾃定义的属性和⽅法。实际上,窗体正是这样⼀种类模块,在其上可安放控件,可显⽰窗体窗⼝。
⽤类模块创建对象,这些对象可被应⽤程序内的过程调⽤。标准模块只包含代码,⽽类模块包含代码⼜包含数据,可视为没有物理表⽰的控件。
4 标准模块和对象模块的区别
⽂档模块、窗体模块是属于对象模块的,可以作为⼀类,标准模块则是不同的,属于另外⼀类。
4.1 标准模块是不⽀持事件,对象模块都⽀持事件过程。
标准模块本⾝是没有事件过程的,这也就是说,你想写事件过程,绝对不要写到标准模块中去,当然你也写不进去。
4.2 标准模块是⼀个独⽴容器,标准模块中的全局变量、Function(函数)过程和Sub过程(⼦过程)是不与对象模块相关联的。
同⼀个⼯程中的对象模块可以共享和使⽤标准模块中的全局变量和过程。但是对象模块的变量和过程,却是该对象模块专属的。如果想调⽤的话,必须以对象的⽅式访问。
这也就告诉我们⼀个原则。通常我们在写VBA代码的时候,应该把公⽤的变量和过程写到标准模块中来,和对象模块相关的变量和过程写到相应的对象模块中去,这样才不容易出现问题。
-End-
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论