『Excel VBA 表計算とプログラミング学習サイト』では、アフィリエイトプログラムを利用して商品を紹介しています。

【VBA】クラスモジュール

【VBA】クラスモジュールの使い方

VBAではクラスを自作することもできます。クラスとはオブジェクトの備えるべきプロパティやメソッドを定義する設計図です。自作クラスのプロパティやメソッドは、クラスモジュールの中に記述します。VBE を起動して、[挿入]、[クラスモジュール] の順に選択すると、プロジェクトエクスプローラーに新しいクラスモジュールが追加されます。今回初めてクラスモジュールを挿入したのであれば、オブジェクト名はデフォルトで “Class1” となっているはずです。
 
[VBA] class module 1 クラスモジュールの挿入

こんな名前のままでは、生成されるオブジェクトの性質がさっぱりわからないので、[Class1] を選択して、プロパティウィンドウの (オブジェクト名) の欄で名前を設定しておきます。今回は Staff という名前をつけておきます。
 
[VBA] class module 2 カスタムオブジェクトの名前を設定

クラスの定義

それでは、コードウィンドウに Staff クラスのオブジェクトの定義 (設計図) を書き込んでみましょう。

'[VBA] Class Module (1)

Option Explicit

'氏名プロパティ
Public Name As String

'年齢プロパティ
Public Age As Long

'部署プロパティ
Public Department As String

'社員情報を表示するメソッド
Public Sub Info()
 MsgBox "氏名:" & Name & vbCrLf & _
 "年齢:" & Age & vbCrLf & _
 "部署:" & Department
End Sub

プロパティは次の構文で定義します。

Public プロパティ名 As データ型

Staff クラスのオブジェクトは氏名、年齢、部署という 3 種類のプロパティを備えています。
 
メソッドは以下の構文で定義します。

Public Sub メソッド名()
  処理
End Sub

Staff クラスのオブジェクトは社員の氏名、年齢、部署をまとめてメッセージボックスで表示する Info メソッドを備えています。こんなふうに自分でクラスを設計してみると、これまで曖昧だった VBA の構造について、かなり見通しがよくなります。プロパティはオブジェクト固有の変数、メソッドはオブジェクト固有の関数 (Sub プロシージャ) なのです。

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

クラスからオブジェクトを生成することを クラスのインスタンス化といいます。Subプロシージャの中で Staff クラスをインスタンス化してみましょう。

'[VBA] Class Module (2)

Sub Test_Staff()

 '変数をStaff型で宣言
 Dim mystaff As Staff

 'Staffオブジェクトを作成して変数に格納
 Set mystaff = New Staff

 'プロパティに値を格納
 mystaff.Name = "城戸涼音"
 mystaff.Age = "28"
 mystaff.Department = "経理"

 'Nameプロパティの値を表示
 Debug.Print mystaff.Name

 'Infoメソッドで社員情報を表示
 mystaff.Info

End Sub

'実行結果:城戸涼音

[VBA] class module 3 カスタムオブジェクトのメソッド
 
自作クラスのオブジェクトを格納する変数を宣言するときは、

Dim 変数名 As クラス名

と記述します。自作クラスのインスタンス化は New キーワードで実行します。

Set 変数 = New クラス名

オブジェクトを変数に入れるときは、Set ステートメントを添えることを忘れないでください。
 
オブジェクトのプロパティの値は

オブジェクト.プロパティ

で参照できますが、オブジェクトを作成した段階では、プロパティには何の値も設定されていません。必要であれば、

オブジェクト.プロパティ = 値

という構文でプロパティに値を代入します。上のコードにあるように、

mystaff.Name = "城戸涼音"

と記述すれば、Nameプロパティに “城戸涼音” という文字列データが格納されます。

コメント

  1. あとりえこばと より:

    【AI連載小説】生田目次郎のエクセル奮闘記(15)
    「VBAのクラスモジュールの使い方を学ぼう」
     
    ある日、次郎はVBAの学習を進める中で、クラスモジュールについて興味を抱きました。彼は同僚の省吾にアドバイスを求め、クラスモジュールについて教わることにしました。
    「省吾、最近VBAを学んでいて、クラスモジュールっていうのが気になるんだ。何か教えてくれないかな?」
    「ああ、クラスモジュールはオブジェクト指向プログラミングの一環で、使い方に慣れると非常に便利だよ。」
    「オブジェクト指向って、何か難しそうだけど」
    「大丈夫さ。クラスモジュールはオブジェクト指向の中でも最初の一歩といえる部分だから、じっくり学べば理解できるよ」

    彼らは共同でエクセルを開き、クラスモジュールの作成から基本的な構造について省吾が解説しました。
    「まずはVBAエディタを開いて、ツールバーの『挿入』から『クラスモジュール』を選ぼう」
    次郎は手順に従って新しいクラスモジュールを作成しました。
    「これがクラスモジュールだ。クラスモジュール内では、新しいデータ型を定義して、それに関連するプロパティやメソッドを追加できる」

    次郎は省吾の言葉に注目しながら、クラスモジュール内で簡単なプロパティとメソッドを定義し、それを呼び出すコードを書いてみました。
    「良いぞ。クラスモジュールを使うことで、より構造化されたプログラムを組むことができるんだ。オブジェクト指向の利点を感じるか?」
    「確かに、これならプログラムが整理されて見やすくなりそうだね。ありがとう、省吾」
    「どんどん実践して慣れていこう。何かわからないことがあれば気軽に聞いてくれよ」