ホーム > カテゴリ > Excel・VBA >

クラスの作成と使い方[ExcelのVBA]

Visual Basic(VB)、Visual Basic for Applications(VBA)でのクラスとは「ある特定の機能をまとめた標準モジュール」と考えて頂くとわかりやすいと思います。ただ、標準モジュールでもSub/Function/Propertyプロシージャを定義できますのでほとんど同じです。

唯一異なる点は、クラスは「オブジェクト」であり、クラスには「Initialize」「Terminate」のイベントや独自のイベントを追加できます。

Wikipediaで補足:クラス オブジェクト

クラスの作成

クラスを作成するには「挿入」メニューから「クラスモジュール」を選択します。そして次にクラス名を今回は「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型で宣言して利用する事も可能です。

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

Sheet、ThisWorkbookはクラスです。図を見て頂くとわかると思いますが、アイコンがクラスのアイコンですね。

また、「ユーザーフォーム」もクラスとなります。

クラスのイベント

クラスに独自のイベントを追加して使用する方法です。

事前準備

「ユーザーフォーム」を作成して「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の標準クラスでアプリケーション(VBAならエクセル)を終了させるには「Application.Quit」を記述します。

Visual Basicの基礎

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

エクセル講座のクイックリンク

ホーム 新機能 基本(初級) 基本(中級) 基本(上級) 関数 マクロ VBA TIPS





関連記事



公開日:2015年06月19日 最終更新日:2015年07月06日
記事NO:01055