VBAではユーザー独自のクラスを定義して利用できます。
クラスモジュールを追加する
クラスの定義はクラスモジュールに記述します。クラスモジュールを追加するには、VBEを起動し、メニューから「挿入」>「クラスモジュール」を選択します。すると下図のようにプロジェクトエクスプローラーに追加されたクラスモジュールが表示されます。

クラス名を変更する
クラスの名前には任意の名前を付けることができます。クラス名を変更するにはプロパティエクスプローラーの「(オブジェクト名)」欄の名前を修正します。ここではBeerという名前に変更しています。

クラスを定義する
クラスモジュールにコードエディタでクラスの内容を定義します。定義する内容はプロパティ(オブジェクトのデータ)とメソッド(オブジェクトの操作)です。
プロパティを定義する
プロパティはオブジェクトのデータ(属性)です。プロパティはPropertyプロシージャで定義します。Propertyプロシージャには次の3つの種類があります。
| プロシージャ | 説明 |
|---|---|
| Property Let | プロパティの値を設定する |
| Property Let | プロパティの値を返す |
| Property Let | オブジェクトに対する参照を設定する |
通常、プロパティは外部に公開するため、PropertyプロシージャにはPublicを付けて外部モジュールからアクセスできるようにします。そうすることで、クラスのユーザーはオブジェクトのプロパティにアクセスできます。
Property Let プロシージャを定義する
プロパティを設定するにはProperty Letプロシージャを使います。構文は次の通りです。
Public Property Let プロパティ名(引数リスト)
' 引数で渡された値を保存する。
End Property
引数リストはSubプロシージャやFunctionプロシージャと同じです。
WaterServerクラスにIDプロパティを追加してみましょう。
Private p_Id As String
Public Property Let Id(id_str As String)
p_Id = id_str
End Property
Property Letプロシージャは文字列の引数を受け取りモジュールレベルのPrivete変数に保存します。
変数にはクラスのユーザーから直接アクセスしてほしくないのでPriveteで宣言してクラスのユーザーから隠ぺいします。ユーザーに公開するのはIdプロパティ(Propertyプロシージャ)であり、Idプロパティに設定された値をp_Id に保存するのは実装の詳細です。ユーザーにはPropertyプロシージャをPublicにすることにより、プロパティに値を設定できること知らせますが、オブジェクトがその値をどのように保存するかまでは公開しません。これはオブジェクト指向のカプセル化を実施しています。
Property Get プロシージャの定義
Property LetプロシージャでIdプロパティ設定できるようになりましたが、このままではプロパティを参照できません。プロパティはProperty Get プロシージャで定義することで参照できるようになります。構文は次の通りです。
Public Property Get プロパティ名() As 戻り値のデータ型
プロパティ名 = 値
End Property
BeerクラスにNameプロパティを追加してみましょう。コードエディタでクラスモジュールに次のコードを追加します。
Public Property Get Id() As String
Id = p_Id
End Property
メソッドを定義する
メソッドはオブジェクトの振る舞い(動作)を定義します。戻り値を返さないメソッドはSubプロシージャで、戻り値を返すメソッドはFunctionプロシージャで定義ます。
WaterServerに水を補給するメソッドを追加してみましょう。
モジュールレベル変数を宣言する
プロパティのデータの格納先となる変数は、クラスモジュールのモジュールレベル変数として宣言します。ここで宣言された変数はクラスモジュール内のすべてのプロシージャから使用できます。また、Priveteステートメントを使用して変数をと宣言することにより外部モジュールのプロシージャから変数を隠ぺいすることができます。
クラスのオブジェクトを生成する
クラスのオブジェクトを生成します。クラスのオブジェクトを生成することをインスタンス化といいます。そのため生成されたオブジェクトのことをインスタンスと呼ぶことがあります。インスタンスはNewキーワードに続けてクラス名を指定します。