クラスの作成と使い方[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プロシージャ(手続き/関数)
クラスの作成と使い方
ファイルの操作
エラートラップ
基本のまとめ(上級者用)
エクセル講座のクイックリンク
関連記事
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









