hakeの日記

Windows環境でプログラミングの勉強をしています。

EXCEL VBAメモ - クラスの定義と使用

メンバ変数へのアクセスはプロパティで行う。コンストラクタの引数でメンバ変数へ値を設定することはできない。検索すると裏技で対応方法がいろいろ公開されているが、後々意味が分からなくなりそうなので使用せずプロパティで行うこと。
引数の無いプロシージャはカッコ不要。
引数はByValを使用する?

クラスの定義

クラスモジュールに作成する。

Option Explicit

' メンバ変数
Private mVal As Long

' コンストラクタ
Private Sub Class_Initialize()
    MsgBox "コンストラクタが実行されました。"
End Sub

' デストラクタ
Private Sub Class_Terminate()
    MsgBox "デストラクタが実行されました。"
End Sub

' プロパティ(Getter)
Public Property Get Val() As Long
    Val = mVal
End Property

' プロパティ(Setter)
Public Property Let Val(ByVal newVal As Long)
    mVal = newVal
End Property

Public Sub Inc()
    mVal = mVal + 1
End Sub

Public Sub Add(ByVal addVal As Long)
    mVal = mVal + addVal
End Sub

Public Function Equal(ByVal eqVal As Long) As Boolean
    If mVal = eqVal Then
        Equal = True
    Else
        Equal = False
    End If
End Function

呼び出し側

Sub foo()
    Dim a As MyClass
    Set a = New MyClass ' コンストラクタ実行
    
    a.Val = 100 ' 引数の形でなく、代入で値を設定する。
    MsgBox a.Val '=> 100
    a.Inc ' カッコを付けない
    MsgBox a.Val '=> 101
    a.Add (10)
    MsgBox a.Val ' => 111
    MsgBox a.Equal(111) '=> True

    Set a = Nothing ' デストラクタ実行
End Sub