VBA 编写类

一、初识类

现在,请打开你的VBE,主菜单-插入-类模块。

插入了一个类模块,也就建立了一个类。类模块的名字就是类的名字。你现在看到的,她的名字叫“类1”,这是VBA按她姐妹排行给她取的的,是的,VBA一贯如此,你早就熟悉了这种规则,现在,在标准模块或其它模块中输入Dim …As的时候,提示框中她已经出现了。但我知道,有件事你正耿耿于怀,“类1”,太没个性了,想改成自己要的名字吧。很容易,和你改标准模块的名字一样,打开属性窗口,看到了吧,第一行就是她的名字,随你的意愿修改吧。

你或许已经注意到,在名字下面,只有一个属性:Instancing,其值也只有两个选项:Private和PublicNotCreatable。事实上,你完全可以忽略这个Instancing,就象你完全忽略条件编译指令一样,因为在VBA中我们几乎用不到它们,而只需维持她的默认值即可。至少我是这样认为的,但我给不了您充足的理由,而只是个人的一种狭隘经历。既然提到了,就简单说明一下:

Instancing属性决定该“类”在其它工程中是否可以被使用。我们知道,标准模块中的Public过程,可以保存在宏工作簿甚至直接被另一工作簿的工程调用,但类中的代码是不可分割的整体,所以必须整体决定是否允许外用。当Instancing属性设为Private(默认)时,不允许其它工程访问。当设置为PublicNotCreatable时,只有在自己的工程创建了该类的对象时,其它工程才允许使用这个对象,注意,仅仅是在本工程中创建的对象,而不能用她在其它工程中创建对象。

二、创建类属性

我们将“类1”改名为“MyClass”并为它创建一个名称为x的字符型属性。

1.使用Public变量创建类属性

在类模块中写下行代码:

Public x$

是的,就这么简单,通常情况下,只需要这么简单。

2.使用Property过程创建类属性

Private s$

Public Property Get x() As String

x = s

End Property

Public Property Let x(ByVal c As String)

s = c

End Property

我们可以省去上面默认的Public。但看上去还是有点麻烦哦,不仅需要两个公共过程,而且还要一个辅助的私有变量s和一个参数c。在类模块中,Property过程把对属性的读写分开了,说一下Property过程的工作机制,当标准模块中的代码读取对象的属性时,便会触发存在的Property Get过程,或者说Property Get过程提供了属性的读功能,同样,Property Let过程提供了写属性。这样,上面的两个过程(当然在模块中没有先后的要求),可以只有一个,或者虽然两个都有,但却不全是Public,从而提供出去的属性是只读或只写(呵呵,没见过只写哈)。仅仅是为了提供只读或只写的属性,代码就从一行变成了七行?!这样的理由,你不会信服, VBA中的类通常是提供给我们自己使用的!如果它确实是只读的,我们自觉地去只读就是了!我们使用Property过程还有其它理由,最基本的一条,我们可以利用这个“过程”来做我们想做的事。看一看:

Public Property Let x(ByVal c As String)

s = Format(c, '0000')

End Property

这里我们只是简单的利用了一下,更多的在后面你会看到。此外,谁会保证有一天你不使用VB给别人提供类呢,这个技术可是通用的。提供一段标准模块的测试代码,来看看我们上面构建的类属性,你自己试试吧。

Sub aTest()

Dim mc As New MyClass

mc.x = '123'

Debug.Print mc.x

End Sub

就象我们给普通变量和对象变量赋值的方式不同一样,对象变量是使用Set赋值的。对“对象”属性,VBA提供了Property Set来代替构建“普通”属性使用的Property Let。来看一段代码:

Private tx As Object

Property Get x() As Object

Set x = tx

End Property

Property Set x(ByVal o As Object)

Set tx = o

End Property

和前面的比较一下,出来多一个Set,实在没有什么不同。

告诉你一个小秘诀,你可以按照Function去记住Property Get的用法,按照Sub去记住Property Let /Set。

3.属性的初始值

我们常常希望,当一个对象建立的时候,它的某些属性会被自动赋予一个初始值,这样,对具有最常见的属性值的对象可以减少重复性的赋值工作。这需要借助于类的构建函数来完成。

在类模块代码窗口的“通用”框中点击向下的小三角箭头,选择“Class”,右面声明框中可以看到两个选项,“Initialize”和“Terminate”,我们对它们应该不陌生,很多对象都有这两个事件,Initialize事件当对象建立时发生,Terminate事件在对象对释放时发生。由于类是静态存在的,它并不是真正的对象,所以在类模块中,它们通常被称为构建函数和析构函数,或构建过程和析构过程。对它们的理解和你在对象中的用法并没有什么不同。当一个对象被建立时,构建函数将被首先执行,同样,当对象释放后,将执行析构函数。

下面建立MyClass,属性x初始值为”0001”的全部测试代码:

[类模块MyClass的代码]

Option Explicit

Private s$

Public Property Get x() As String

x = s

End Property

Public Property Let x(ByVal c As String)

s = c

End Property

Private Sub Class_Initialize()

s = '0001'

End Sub

[标准模块1的代码]

Option Explicit

Sub aTest()

Dim mc As New MyClass

Debug.Print mc.x

End Sub

三、创建类方法

1、构建类的方法其实就是在类模块中写公共的Sub和Function
2、方法的兄弟—成员事件

我们来看一个具有普遍意义的事例。

[重要例]

窗体UserForm1上有5个CommandButton控件(名称分别为默认CommandButton 1- CommandButton 5)和1个TextBox控件(名称为TextBox1)。要求当各个CommandButton控件被点击时,它的按钮文字(Caption)会写入TextBox1。

如果不用类,我们需要为5个CommandButton控件分别写5个相同的Click事件代码。如:

Private Sub CommandButton 1_Click()

TextBox1 = CommandButton 1.Caption

End Sub

下面是用类的成员事件方法的代码:

'类模块Cmds的代码

Option Explicit

Public WithEvents cmd As CommandButton

Private Sub cmd_Click()

UserForm1.TextBox1 = cmd.Caption

End Sub

'窗体UserForm1的代码

Option Explicit

Dim co As New Collection

Private Sub UserForm_Initialize()

Dim i%

Dim myc As Cmds

For i = 1 To 5

Set myc = New Cmds

Set myc.cmd = Me.Controls('CommandButton' & i)

co.Add myc

Next i

Set myc = Nothing

End Sub

最后提一下Friend关键字,虽然在VBA中几乎没有什么用,但如果有一天你要制作ActiveX部件,可能会用到它。之所以要有Friend关键字,是因为类的私有部分在类模块外是不可见的,但有时却需要从外面访问这些私有部分,这时,可以使用Friend关键字使属性和方法成为“友元成员”。友元成员在本工程中相当于Public,但在工程外,它仍是Private 。

(0)

相关推荐

  • VBA专题10-21:使用VBA操控Excel界面之禁用和启用控件、组和选项卡

    excelperfect 内置控件 通过分别使用enabled属性和getEnabled属性,可以在设计时永久地或者在运行时动态地禁用(和启用)内置控件.被禁用的控件在功能区中显示的是灰色. 例如,下 ...

  • 就用一个按钮来控制显示不显示公式栏

    现在可以绘制一个按钮1,编写如下代码,让其不显示. 以下代表可以录制一个宏,点击视图,编辑栏,再查看相应的代码,如果这个不会操作,请参考以前的教程,本教程为VBA连载,可以翻阅以前的几十篇章教程. P ...

  • 如果使用VBA经常需要输入以下的表头

    如果使用VBA经常需要输入以下的表头. 方法有很多种. 最简单易容易理解的可以使用以下代码: Private Sub CommandButton1_Click() Range("a1&quo ...

  • VBA专题10-20:使用VBA操控Excel界面之隐藏和取消隐藏控件、组和选项卡

    excelperfect 内置控件(不被允许) 不能够单独隐藏内置组中的内置控件.然而,可以隐藏内置组,因此会隐藏该组中的所有控件.可以单独禁用(和启用)组中的控件. 下表中的command元素的可用 ...

  • VBA如何设置系统时间,教你这么做,学会就是比别人强

    No.1 Excel 中如何获取时间和设置时间. 以前不知道,VBA可以做很多事情,实现很多功能. 对于系统时间,也可以用vba一行来代码实现修改. 读完本章内容,你也会设置电脑系统时间. Excel ...

  • VBA中使用名称引用

    如下表格区域,如果经常需要对北京对应的区域进行求和求平均等. 我们可以选择A2:A13,进行命名操作. 如下图,选择区域,名称框中输入"BJ",回车. " 以后就可以直接 ...

  • Excel VBA程序的编写

    摘要:本文通过代码演示,介绍如何从Active Directory中检索信息并将信息显示在带格式的Excel工作表中. (注:本文摘自Microsoft Corporation 技术人员Greg St ...

  • 「翔博精选指标」距当日K线N日前画竖线主图源码 通达信 贴图 编写技巧类!

    做价值的传播者,一路同行,一起成长 适用软件:通达信 公式说明:不包含未来函数,不加密,副图公式 指标公式描述 距当日K线N日前画竖线主图源码 通达信 贴图 编写技巧类 CD:= CURRBARSCO ...

  • #String类简述(小白理解,小白编写,欢迎大神指点,小白跪谢)

    @ 目录 一.前言(可忽略) 二.String变量的认知 三.String类的构造方法 四.String类的基本方法 4.1 toString()方法 4.2 equals()方法 4.3 equal ...

  • VBA类之一(初识类)

    第一章 开头篇                                 --认识类 Visual Basic是基于对象的编程(注:本文所有的代码和讨论将都以VB为基础模型,不过我会尽量使用一些 ...

  • VBA类模块初步

    这里简单地介绍VBA中的类模块,使大家能够在应用程序中创建并使用简单的类. 类是对象的"模板".对象可以是任何事物,而类不会做任何事情,也不会占用内存,只有当类成为对象并使用Set ...

  • [VBA]类模块

    使用类模块可以创建自定义的类,使用此类作为模板创建对象. 类模块包含一系列的属性,方法和事件,用来和其他对象或创建对象的代码交互. · 属性   有两类属性,第一类为Public类型的模块级变量,第二 ...

  • Excel VBA 7.37单工作薄跨工作表按类对指定列进行求和,vba VS sum函数!

    一起学习,一起进步~~ 昨天我们分享了关于数据计算的第一篇,主要针对相同数据类进行求和,这种求和方法能够实现sum()函数无法实现的方法,我不是函数高手,理论上来说可能需要的公式也比较的长,今天我们继 ...

  • Excel VBA 7.36跨工作表对数据按类求和,你还在敲计算器?

    一起学习,一起进步~~ 关于工作表数据的合并写的有点多,超出预料之外的,除了自己本身计划的,后面也是陆续增加了很多小伙伴们的各种特殊要求,说明大家对于数据合并的需求还是很大的,小伙伴们有空了可以去阅读 ...

  • VBA 类模块理解和使用总结

    目 录 VBA 类模块理解和使用总结 一.类的概念 二.类的定义 三.类详细定义 关于封装 关于多态 关于异常 关于自定义事件 四.结论: VBA 类模块理解和使用总结 一.类的概念 记得有人总结,V ...