【作成中】【Excel VBA】クラスを利用する

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プロシージャを通して)値を設定したり・参照できたりするので変数のように振舞いますが、もっと抽象的な概念です。

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プロシージャで定義ます。

クラスに付属するSubプロシージャやFunctionプロシージャはメソッドと呼ばれます。

WaterServerに水を補給するメソッドを追加してみましょう。

モジュールレベル変数を宣言する

プロパティのデータの格納先となる変数は、クラスモジュールのモジュールレベル変数として宣言します。ここで宣言された変数はクラスモジュール内のすべてのプロシージャから使用できます。また、Priveteステートメントを使用して変数をと宣言することにより外部モジュールのプロシージャから変数を隠ぺいすることができます。

クラスのオブジェクトを生成する

クラスのオブジェクトを生成します。クラスのオブジェクトを生成することをインスタンス化といいます。そのため生成されたオブジェクトのことをインスタンスと呼ぶことがあります。インスタンスはNewキーワードに続けてクラス名を指定します。

よかったらシェアしてね!
  • URLをコピーしました!
目次