ホーム > カテゴリ > 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


この記事を書いた人

💻 ITスキル・経験
サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。

画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ
プチモンテ代表、アーティスト名:プチモンテ
🎵 音楽制作
BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は叙情詩、叙情的な楽曲が多い。楽曲制作は2023年12月中旬 ~

オリジナル曲を始めました✨

YouTubeで各楽曲を公開しています🌈
https://www.youtube.com/@petitmonte

【男性ボーカル】DA・KA・RA | 新たな明日が風と共に訪れる

【男性、女性ボーカル】時空を超越する先に | 時空と風の交響曲

【女性、男性ボーカル】絆 | 穏やかな心に奏でる旋律