クラスの作成と使い方[ExcelのVBA]
Visual Basic(VB)、Visual Basic for Applications(VBA)でのクラスとは「ある特定の機能をまとめた標準モジュール」と考えて頂くとわかりやすいと思います。ただ、標準モジュールでもSub/Function/Propertyプロシージャを定義できますのでほとんど同じです。
唯一異なる点は、クラスは「オブジェクト」であり、クラスには「Initialize」「Terminate」のイベントや独自のイベントを追加できます。
クラスの作成
クラスを作成するには「挿入」メニューから「クラスモジュール」を選択します。そして次にクラス名を今回は「MyCls」と変更します。

もう、いきなりソースコードを書きますね :-)
クラス側
Option Explicit ' クラスのメンバ変数 Private m_Value As Long ' 現在位置の保存用 ' クラスのコンストラクタ Private Sub Class_Initialize() Debug.Print ("--- コンストラクタ(クラス初期化時のイベント) ---") m_Value = 50 End Sub ' クラスのデストラクタ Private Sub Class_Terminate() Debug.Print ("--- デストラクタ(クラス破棄時のイベント) ---") End Sub ' クラスのプロパティ(取得用) Public Property Get Position() As Long Position = m_Value End Property ' クラスのプロパティ(変更用) Public Property Let Position(ByVal vNewValue As Long) m_Value = vNewValue End Property ' クラスのメソッド Public Sub Add(ByVal vAddValue As Long) m_Value = m_Value + vAddValue End Sub
シートまたはフォーム側
Option Explicit Private Sub CommandButton1_Click() Dim A As MyCls ' クラスの定義(MyClsクラスのAオブジェクトの定義) Set A = New MyCls ' クラスの生成(MyClsクラスのインスタンスを生成してAオブジェクトに代入) Debug.Print ("初期時のポジション:" & A.Position) ' Positionプロパティに70を代入する A.Position = 70 ' Positionプロパティの値を取得 Debug.Print ("現在のポジション:" & A.Position) ' MyClsクラスのAddメソッドでポジション(30)を加算する A.Add (30) ' Positionプロパティの値を取得 Debug.Print ("現在のポジション:" & A.Position) ' クラスの破棄(厳密にはインスタンスへの参照を破棄) Set A = Nothing End Sub
実行
実行してコマンドボタンを押すとこのようになります。

クラスに「Initialize」「Terminate」イベントを追加するにはクラスモジュールを選択後に図のようにします。

PropertyプロシージャやSubプロシージャ(メソッドとも呼びます)は「挿入」メニューの「プロシージャ」から挿入可能です。
その他は、コード内にクラスに関してのコメントを書いて置きましたので、使い方はそこから読み取ってくださいね。いつものようにWikipediaでの補足のリンクも貼って置きます。

但し、Object型は便利な反面、処理速度が遅いですので注意が必要です。

また、「ユーザーフォーム」もクラスとなります。
クラスのイベント
クラスに独自のイベントを追加して使用する方法です。
事前準備
「ユーザーフォーム」を作成して「Label(ラベル)」と「CommandButton」を配置します。

クラス側
Option Explicit ' クラスのメンバ変数 Private m_Value As Long ' 現在位置の保存用 ' クラスのイベント Public Event Change() ' *** 現在の位置が変更されたらイベントが発生する ' クラスのコンストラクタ Private Sub Class_Initialize() Debug.Print ("--- コンストラクタ(クラス初期化時のイベント) ---") m_Value = 50 End Sub ' クラスのデストラクタ Private Sub Class_Terminate() Debug.Print ("--- デストラクタ(クラス破棄時のイベント) ---") End Sub ' クラスのプロパティ(取得用) Public Property Get Position() As Long Position = m_Value End Property ' クラスのプロパティ(変更用) Public Property Let Position(ByVal vNewValue As Long) m_Value = vNewValue RaiseEvent Change ' *** イベントを発生させる End Property ' クラスのメソッド Public Sub Add(ByVal vAddValue As Long) m_Value = m_Value + vAddValue RaiseEvent Change ' *** イベントを発生させる End Sub
ユーザーフォーム側
Option Explicit ' イベントとクラスを定義する Private WithEvents A As MyCls Private Sub A_Change() ' ラベルにメッセージを表示する Label1.Caption = "現在の位置は" & CStr(A.Position) & "です。" End Sub Private Sub CommandButton1_Click() ' 現在の位置を設定する A.Position = 70 End Sub Private Sub UserForm_Initialize() Set A = New MyCls ' クラスの生成 End Sub Private Sub UserForm_Terminate() Set A = Nothing ' クラスの破棄 End Sub
ユーザーフォーム側の6行目「Sub A_Change()」のイベントは「Private WithEvents A As MyCls」を定義すると図のように追加できるようになります。

実行
実行してコマンドボタンを押すと次のようになります。

ラベルに現在の位置が表示されました。
メモ

Visual Basicの基礎
変数/定数/リテラル/データ型/有効範囲
配列/動的配列/構造体/列挙型/エスケープシーケンス
算術演算子/比較演算子/データの型変換
制御構造(If/For/Select/While/Do)
Sub/Functionプロシージャ(手続き/関数)
クラスの作成と使い方
ファイルの操作
エラートラップ
基本のまとめ(上級者用)