ray88’s diary

お仕事で困ったとき用の自分用の覚書

VBA クラスモジュール InitializeイベントとTerminateイベント

Initializeイベント:オブジェクトの初期化などインスタンスが生成されるときに必要な処理を記述する
Terminateイベント:インスタンスの破棄時に必要な処理を記述する

■サンプルコードの図解
f:id:ray88:20210508144000p:plain

■サンプルコード
 クラスモジュール(Customerクラスを利用してCustomersクラスを作成)

Option Explicit
'顧客情報セットのコレクション
Private myItems As Collection

'変数の初期化
Private Sub Class_Initialize()
    Set myItems = New Collection
End Sub

'変数の破棄
Private Sub Class_Terminate()
    Set myItems = Nothing
End Sub

'顧客情報を追加する
Public Sub Add(ByVal vID As String, ByVal vName As String, ByVal vAge As Integer, ByVal vGender As String)
    '顧客情報のセットであるCustomerクラスのオブジェクトを生成する
    Dim vCustomer As Customer
    Set vCustomer = New Customer
    
    'Customerオブジェクトに顧客情報を設定する
    With vCustomer
        .ID = vID
        .Name = vName
        .Age = vAge
        .Gender = vGender
    End With
    
    'コレクションに顧客情報セットを追加する
    myItems.Add vCustomer
    
    'Customerオブジェクトを初期化
    Set vCustomer = Nothing
    
End Sub

'顧客情報を取得する
Public Property Get Item(ByVal Index As Long) As Customer
    '顧客情報セットのコレクションmyItemよりアイテムのインデックス番号に紐づくデータを返す
    Set Item = myItems.Item(Index)
End Property

呼び出し元プロシージャ

Option Explicit
'表の列番号を定数化
Enum ColName
    ID = 1
    Name = 2
    Age = 3
    Gender = 4
End Enum
Sub テスト()

    '表データを格納する変数
     Dim TableValue As Variant
    '表最終行格納用変数
    Dim lngLastRow As Long

    '表データをバリアント型配列に格納
    With Worksheets("Sheet2")
        .Select
       lngLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
       TableValue = .Range(Cells(4, 2), Cells(lngLastRow, 5))
    End With
    
    '顧客情報のセットのコレクションであるCustomersクラスのオブジェクトを生成する
    Dim objCustomers As Customers
    Set objCustomers = New Customers
 
    '表データより顧客情報を取得しCustomerオブジェクトに値を設定
    Dim i As Long
    For i = LBound(TableValue) To UBound(TableValue)
            objCustomers.Add TableValue(i, ColName.ID), TableValue(i, ColName.Name), _
                             TableValue(i, ColName.Age), TableValue(i, ColName.Gender)
    Next
    
    '表から取得した顧客情報を抽出
    '(年齢18歳未満・性別規定値以外はCustomerクラスで設定したエラー値である-1を出力)
    For i = LBound(TableValue) To UBound(TableValue)
        Debug.Print objCustomers.Item(i).ID
        Debug.Print objCustomers.Item(i).Name
        Debug.Print objCustomers.Item(i).Age
        Debug.Print objCustomers.Item(i).Gender
        Debug.Print vbCrLf
    Next
    Set objCustomers = Nothing
End Sub

Sheet2の表を読み取ってイミディエイトウィンドウへ出力した結果
f:id:ray88:20210508190843p:plain