VBA 类模块系列之六——类对象的初始化

上篇谈到类对象在初始化的时候,某些属性要是能够自动初始化就好了,会省去你一些麻烦。这就是本篇要谈的,类对象的初 … 继续阅读“VBA 类模块系列之六——类对象的初始化”

上篇谈到类对象在初始化的时候,某些属性要是能够自动初始化就好了,会省去你一些麻烦。这就是本篇要谈的,类对象的初始化。

我们知道类的接口包含了属性,方法和事件。这里的事件是指我们在类中定义的事件。类除了我们外加给它的自定义事件以外,它与生俱来的就有2个事件:实例化事件(Class_Initialize)销毁事件(Class_Terminate)。现在只谈实例化事件。

实例化事件,或者叫初始化事件,顾名思义,是在类实例化的时候自动触发。类什么时候被实例化呢?就在执行set objPerson = New Person这条语句的时候。如果你在初始化事件中写入一些代码,这些代码就会自动执行。类的初始化事件是我们初始化类属性的最佳场合。

我们在Person类代码模块中,代码窗格左上方的对象下拉框里面选择Class,右上方的事件下拉框中选择Initialize,类的实例化事件的响应子程序就自动创建好了。

Class_Initalize()这个事件响应子程序,与大家比较熟悉的Form_Load()事件响应子程序没有什么不同。只要这个事件发生了,那么就会自动执行其中的代码。现在我们就可以把场合(Situation)这个属性的初始化放在Class_Initalize()中了。

Option Compare Database
Option Explicit

Public Name As String
Public Gender As String
Public Situation As String

Public Sub Speak()
    Select Case Situation
        Case "一般"
            MsgBox Left(Name, 1) & "小姐"
        Case "正式"
            MsgBox Left(Name, 1) & "女士"
        Case "撩"
            MsgBox "小姐姐"
        Case Else
            MsgBox Name
    End Select
End Sub

Private Sub Class_Initialize()
    Situation = "一般"
End Sub

既然场合(Situation)属性已经被初始化了,标准模块中就不用再初始化该属性了。

Option Compare Database
Option Explicit

Sub test()
    Dim objPerson As Person
    Set objPerson = New Person
    
    objPerson.Name = "赵冰冰"
    objPerson.Gender = "女"
    objPerson.Speak
End Sub

我们重新执行一遍Test()子程序,会得到同样的结果。

我们知道,一个人生下来是男是女,这辈子都不会变了,当然你说可以到泰国去变性,好吧,你说得对,但一般大多数人是不会这么干的。我们来看看我们的类,你会发现,性别初始化以后,我们很容易的就能将它修改了。我们在Test()子程序中,可以随意的添加一行代码:objPerson.Gender = “男”,这个人就变性了。

在类中,我们有没有办法阻止类的使用者做这样操作呢?答案当然是肯定的^_^下一篇将给大家介绍一种更加健壮的定义属性的方法。

VBA 类模块系列之五——使用你的第一个类

第二篇中我介绍过,类就是做饺子的塑料模具。到目前为止,我们做好了一个叫做Person的模具。现在我们要用这个模 … 继续阅读“VBA 类模块系列之五——使用你的第一个类”

第二篇中我介绍过,类就是做饺子的塑料模具。到目前为止,我们做好了一个叫做Person的模具。现在我们要用这个模具做真正的饺子了。

还记得你是怎样使用ADODB库中的Recordset对象的吗?你在窗体代码模块,或者标准代码模块里面声明一个Recordset变量(Dim rst as Recordset),然后使用Set rst = New Recordset 语句创建一个Recordset对象,将rst指向这个新创建的对象。这里我们也是一样的操作:插入一个标准代码模块,然后添加一个子程序Test(),在子程序中添加如下代码:

现在对象变量objPerson指向了一个真正的“饺子”了,这个“饺子”有3个属性:姓名,性别,场合。现在这3个属性都是空白的,什么值都没有。所以我们要先给它们赋值。

Option Compare Database
Option Explicit

Sub test()
    Dim objPerson As Person
    Set objPerson = New Person
    
    objPerson.Name = "赵冰冰"
    objPerson.Gender = "女"
    objPerson.Situation = "一般"

End Sub

属性赋值以后,我们就可以调用类的方法了,目前只有一个方法Speak。

Option Compare Database
Option Explicit

Sub test()
    Dim objPerson As Person
    Set objPerson = New Person
    
    objPerson.Name = "赵冰冰"
    objPerson.Gender = "女"
    objPerson.Situation = "一般"
    objPerson.Speak
End Sub

我们执行一下这个子程序,一个这样的信息窗口就会跳出来:

我们成功了!感觉如何?我们创建了自己的类,又用它实例化了一个对象,设置了它的属性,调用了它的方法。

欣喜之余,冷静的读者可能会提出一个问题来:调用类的方法Speak前,还需要设置这么多的属性,忙乎了半天,这个类也没帮到我们多少事情,何必呢?好吧,你说得对。如果对象在创建的时候,某些属性就能自动初始化,比如让场合(Situation)这个属性默认设置为“一般”,那就好了。我们就可以少初始化一个属性了。

这个问题当然是有办法解决的。这正是下一篇我们要谈到的:类的实例化事件。

VBA 类模块系列之四——创建你的第一个类

前三篇终于啰嗦完了,牛逼也吹完了,我们现在来创建一个类。 首先在VBE里面,选择插入菜单-类模块,一个空白的类 … 继续阅读“VBA 类模块系列之四——创建你的第一个类”

前三篇终于啰嗦完了,牛逼也吹完了,我们现在来创建一个类。

  1. 首先在VBE里面,选择插入菜单-类模块,一个空白的类模块就创建好了。

2. 接下来,要想一下,我们用这个类来干嘛用?还没想好去哪里,我就出门了,哈哈。这个应该放在第一步。好吧,比方说我们现在要用这个来为模拟一个人(Person),第二篇里面谈到,类的接口是由属性方法事件构成的,那么我们要模拟人的哪些属性,方法,事件呢?

我们先来考虑属性(Properties)

人的属性太多了,姓名,性别,年龄,身高,体重,民族等等。我们弄简单点,只考虑他的姓名(Name)和性别(Gender)。

我们确定了目标,就可以开始行动了。因为我们要用这个类来模拟一个人(Person),那首先我们就将这个类的名字改成Person。这个很简单,在左下角的名称属性里面,将“类1”改为“Person”。然后我们在类中建立姓名和性别这2个属性。

为类创建一个属性,最简单的方法就是在类的头部声明一个公共变量。我们申请2个:

Option Compare Database
Option Explicit

Public Name As String
Public Gender As String

3. 属性添加好了,接下来考虑方法。这个类需要什么方法呢?因为这个类就只有2个属性,姓名和性别,比如某个美女,她叫赵冰冰,你会怎么称呼她呢?这个得看你跟她的关系了。如果你们之间很陌生的话,你会叫她“赵小姐”,如果是在非常正式的场合,你应该叫“赵女士”,如果你想撩她,你会叫她“小姐姐”。我们给这个类添加一个名叫称呼(Speak)的方法。但是根据什么来确定你称呼的方式呢?我们需要再多添加一个确定场合(Situation)的属性,有了这个属性,我们才好确定该用何种方式称呼她。

Option Compare Database
Option Explicit

Public Name As String
Public Gender As String
Public Situation As String

Public Sub Speak()
    Select Case Situation
        Case "一般"
            MsgBox Left(Name, 1) & "小姐"
        Case "正式"
            MsgBox Left(Name, 1) & "女士"
        Case "撩"
            MsgBox "小姐姐"
        Case Else
            MsgBox Name
    End Select
End Sub

我们添加好了如上的代码,我们只分了3种场合,如果不是这3种场合,我们就直接称呼她的姓名好了。

我们的第一个类就这样轻松设计好了。