たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_クラスモジュール

クラスモジュールとは何か、どんな場合にどのように利用するのか

クラスモジュールとその利用場面

クラスモジュールとは、独自のオブジェクトを設計するモジュール
例えば以下の理由により、自分自身で独自のオブジェクトを作成したい場合に使用する
・同じ機能を複数個所で使いまわしたい
・複数人で開発に取り組む場合に、それぞれが同じ機能を重複して作成する状況を避けたい

【独自のオブジェクトの作成~利用までの流れ】
1:クラスモジュールでオブジェクトを設計
2:インスタンスを生成(オブジェクトを実体化)することでオブジェクトを利用可能な状態にする
3:設計したオブジェクトを使用する(当記事では標準モジュールで使用)

▼混乱防止のため自分に言い聞かせる▼
クラスモジュールでオブジェクトを作る
そのオブジェクトを標準モジュールで使う
(当記事の例では)

クラスモジュールでオブジェクトを設計

1:クラスモジュールを作成
VBEを起動しプロジェクトエクスプローラの中で右クリック、挿入ークラスモジュールを選択

▼参考▼


次に、プロパティウィンドウ内「オブジェクト名」の右横のボックスで、任意の名称に変更
※今回は例として「ClassModule1」という名前にした



2:メソッドとプロパティを作成

作成したクラスモジュール内でそれぞれ作成
クラスモジュールで使用できるInitializeイベント・Terminateイベントを、必要に応じて利用する

プロパティの作成方法は以下のいずれか
1.クラスモジュールの宣言セクションで変数を宣言
 ※プロシージャレベル変数はオブジェクトのプロパティとして使用することはできない
 ※この方法は1行でプロパティを作成できるが
 直接値を書き換えることができてしまう(プロパティプロシージャを経由しない)ためあまりよくない
2.以下のプロパティプロシージャをペアでクラスモジュールに記述※項5にて記述例を記載
 Property Let プロシージャ名(引数) →プロパティに値を設定
 PropertyGet プロシージャ名(引数) As 戻り値 →プロパティから値を取得
 ※どちらのプロシージャともPublicのみオブジェクトのプロパティとして利用できる、ちなみに"Public"の記述は省略可
 ※上記のように記述する=プロパティが作成される、とみてよさそう

メソッドの作成方法は以下
・SubプロシージャまたはFunctionプロシージャでクラスモジュールに記述
 ※どちらのプロシージャともPublicのみオブジェクトのメソッドとして利用できる、こちらも"Public"の記述は省略可
 ※注意点として、Privateではオブジェクトのメソッドとして利用できない

▼記述例【クラスモジュール】▼

'--------宣言セクション--------
Public ひとつめのプロパティ As String 'プロパティ作成
'----------------------
Private Sub Class_Initialize() 'インスタンス生成のタイミングで発生するイベント
 Debug.Print "インスタンス生成------------"
 ひとつめのプロパティ = "あああ"
End Sub

Sub 私はメソッド() 'メソッド作成
 Debug.Print ひとつめのプロパティ
End Sub

Private Sub Class_Terminate() 'インスタンス破棄のタイミングで発生するイベント
 Debug.Print "インスタンス破棄------------"
End Sub

インスタンスを生成(オブジェクトを実体化)

1:標準モジュールを作成
まずは、クラスモジュールの作成で行ったのと同じ要領で標準モジュールを作成(モジュール名は任意)

2:インスタンスを生成する記述を行う
インスタンスを作成する書式は、以下のうちどちらでもよい
記述方法1
Dim インスタンス名 As クラスモジュール名
Set インスタンス名 = New クラスモジュール名

記述方法2
Dim インスタンス名 As New クラスモジュール名

▼記述例【標準モジュール】インスタンスの生成▼

Sub インスタンス生成と実行()
 Dim ClassModule1のインスタンス As New ClassModule1 'インスタンスを生成
End Sub

設計したオブジェクトを使用

1:Subプロシージャ「生成と実行」に、以下のように追記

▼記述例【標準モジュール】インスタンスの実行▼

Sub インスタンス生成と実行()
 Dim ClassModule1のインスタンス As New ClassModule1 'インスタンスを生成
 ClassModule1のインスタンス.私はメソッド 'クラスモジュールの中に記述されているメソッドの中身が実行される
End Sub


2:Subプロシージャ「生成と実行」を実行

▼実行結果▼


【重要】プロパティプロシージャの使用

項目2-2で書いた「プロパティプロシージャでプロパティを作成する方法」の記述例を載せておく
例として「私は2つめのプロパティ」という名前のプロパティを追加で作成する

1:クラスモジュールに以下のように追記する

▼記述例【クラスモジュール】▼

'--------宣言セクション--------
Public ひとつめのプロパティ As String 'プロパティ作成_クラスモジュールの宣言セクションに記述
Dim Num As Integer '★★追記:2つめのプロパティの値を受け取る用の変数を準備★★
'----------------------
Private Sub Class_Initialize() 'インスタンス生成のタイミングで発生するイベント
 Debug.Print "インスタンス生成------------"
 ひとつめのプロパティ = "あああ"
End Sub

Sub 私はメソッド() 'メソッド作成_クラスモジュールの宣言セクションに記述
 Debug.Print ひとつめのプロパティ
End Sub

Private Sub Class_Terminate() 'インスタンス破棄のタイミングで発生するイベント
 Debug.Print "インスタンス破棄------------"

'★★これより下を追記★★

Property Let 私は2つめのプロパティ(val As Integer) 'Subプロシージャ側でこれから設定する値(後述)を変数valで受け取る
  Num = val '受け取った値を変数に格納
End Property

Property Get 私は2つめのプロパティ() As Integer '変数Numの値が、Subプロシージャ側でこれから取得される値として戻る
  私は2つめのプロパティ = Num
End Property


2:Subプロシージャ「生成と実行」に、以下のようにさらに追記する

▼記述例【標準モジュール】インスタンスの設定と取得▼

Sub インスタンス生成と実行()
 Dim ClassModule1のインスタンス As New ClassModule1 'インスタンスを生成
 ClassModule1のインスタンス.私はメソッド 'クラスモジュールの中に記述されているメソッドの中身が実行される
 ClassModule1のインスタンス.私は2つめのプロパティ = 111 '★★追記:2つめのプロパティに値「111」を設定★★
 Debug.Print ClassModule1のインスタンス.私は2つめのプロパティ '★★追記:2つめのプロパティの値を取得★★
End Sub


振り返り…
オブジェクトが先にあって、それを標準モジュールのsubプロシージャで動かすということ自体はわかるのだが
処理順にみていく形で追っていかないと理解できなかった…
別のプロシージャに値渡し・参照渡しする書き方や、動的配列の宣言の書き方などが頭の中で思い起こされ無駄に混乱した