Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Excel VBAのクラスを学ぶ2

はじめに

前回はクラスについて、プロパティを定義する方法までを説明しました。

lbibouroku.hatenablog.com

今回は続きの、クラスにはメソッドを定義する方法から始めます。

◆目次◆

クラスにメソッドを定義する方法

オブジェクトにメソッドを追加する方法と同じです。

  • Subプロシージャ
  • Functionプロシージャ

例:Personクラスに、挨拶をするメソッドと、お腹がすいたら「ご飯を食べる」というメッセージを返すメソッドを追加

'[Person]
Public Sub Greet()
    MsgBox "Hello!"
End Sub

Public Function Eat() As String
    If MsgBox("お腹がすいた?", vbYesNo) = vbYes Then
        Eat = "ご飯を食べる"
    End If
End Function

'[Module1]
Sub personclass_test1()
    Dim myPerson As Person
    Set myPerson = New Person
    
    myPerson.Greet
    MsgBox myPerson.Eat
End Sub

実行結果は、以下のとおりです。 * 「Hello!」というメッセージボックスが表示される * 「お腹がすいた?」というメッセージボックスが表示され、「はい」を選択すると、「ご飯を食べる」というメッセージボックスが表示される

Cloneメソッド

自身のコピーをオブジェクトとして生成し返すメソッドです。

例:同じ名前と血液型を持つクローンメソッドを作る

'[Person]クラスモジュール
'変数Nameはパブリック変数にして、ほかのモジュールでも参照可能にする
Public Name As String

'変数bloodType_はプライベート変数にして、Propertyプロシージャでセッターとゲッターを作る
Private bloodType_ As String

Public Property Let BloodType(ByVal newBloodType As String)
    bloodType_ = newBloodType
End Property

Public Property Get BloodType() As String
    BloodType = bloodType_
End Property

'クローンメソッドを使って
'同じ名前と血液型を持つインスタンスを戻り値を使って生成する
Public Function Clone() As Person
    Dim objNew As Person
    Set objNew = New Person

    objNew.Name = Me.Name
    objNew.BloodType = Me.BloodType
    
    Set Clone = objNew

End Function


'[Module1]標準モジュール
Sub cloneTest1()

'myPersonというPersonクラスのインスタンスを生成する
    Dim myPerson As Person
    Set myPerson = New Person
    myPerson.Name = "Bob"
    myPerson.BloodType = "A"

'clonePersonというmyPersonと同じ名前と血液型をクローンのインスタンスを生成する
    Dim clonePerson As Person
    Set clonePerson = myPerson.Clone
    Debug.Print clonePerson.Name '出力結果:Bob
    Debug.Print clonePerson.BloodType  '出力結果:A

'clonePersonの名前を変更する
    clonePerson.Name = "Mike"

'myPersonとclonePersonの名前と血液型を確認する
    Debug.Print myPerson.Name    '出力結果:Bob
    Debug.Print myPerson.BloodType  '出力結果:A

    Debug.Print clonePerson.Name '出力結果:Mike
    Debug.Print clonePerson.BloodType  '出力結果:A

End Sub

clonePersonはmyPersonとは異なるインスタンスなので、clonePersonの名前(Name)を変更しても、myPersonに影響はありません。

コンストラクタとデストラク

どちらもイベントプロシージャで設定します。 f:id:lbibouroku:20210919213230p:plain

インスタンスが生成されたときに実行される。

Initializeイベントで呼び出されるプロシージャ

Private Sub Class_Initialize()

'インスタンスが生成されたときに行う処理

End Sub

インスタンスへの参照がすべて失われたときに実行される。

Terminateイベントで呼び出されるプロシージャ

Private Sub Class_Terminate()

'インスタンスへの参照がすべて失われたときに行う処理

End Sub

さいごに

まだクラスの使いどころがわかっていないので、これから活用して覚えていきたいと思います。