サイトについて      連絡先   検索

VBA クラス

はじめに

Excel VBA マクロのクラスの使い方を紹介します。

ワークシートなどのオブジェクトはすべてクラスで作成されています。

変数や関数 (メソッド) の他にコンストラクタやプロパティを宣言できます。継承はできません。

クラスは複雑なので無理に使用する必要はありません。ワークシートと標準モジュールだけでも大丈夫です。
  • 目次
    • クラスとは
    • クラスを追加する
    • コードを作成する
    • クラスを使用する
    • コンストラクタ
    • プロパティ
    • イベント
    • 値型と参照型の違い

クラスとは

オブジェクトを作成するためのデータ型です。その「型」を好きなように作成できます。オブジェクトはすべて参照型になります。

Sheet1 などのワークシートや、セルを表す Range などのオブジェクトは、すべてクラスで作成されています。

標準モジュールと同じように、変数や関数といったコードを書けます。その他にコンストラクタやプロパティといったクラス専用の機能があります。

クラスの特徴として、インスタンス化すると使用できるようになります。使い終わったら破棄する必要があります。

クラスを追加する

VBE の [挿入] から [クラス モジュール] をクリックします。

7

クラスが追加されます。

8

クラス名を変更するには、その [クラス] を選択した状態で [オブジェクト名] を変更します。

9

このクラス名がデータ型の名前になります。

コードを作成する

Sheet1 などのワークシートに対してコードを作成したときと同じように、クラスにコードを作成できます。


' 変数
Public FirstName As String
Public LastName As String

' 関数
Public Function MyName() As String
    MyName = FirstName & LastName
End Function

クラスを使用する

Dim 変数名 As クラス名のように、変数や関数などの型としてクラス名を入力します。


Dim c As Class1

実際にクラスを使用するには、インスタンス化する必要があります。

Set 変数名 = New クラス名のように入力して、その変数に新しいインスタンスを生成します。New がインスタンス化するキーワードです。オブジェクトを変数に代入するには、頭に Set を付けます。


Dim c As Class1
Set c = New Class1 ' インスタンス化

クラスの変数.変数名クラスの変数.関数名のように入力して、そのクラスの変数や関数を参照できます。


' 変数を操作する
c.FirstName = "Tips"
c.LastName = "found"

' 関数を呼び出す
Dim s As String
s = c.MyName
Debug.Print(s) ' Tipsfound
上記の「コードを作成する」のコードを使用しています。

クラスの変数が不要になったときは、後始末として必ず Nothing を設定します。これでインスタンスが確実に破棄され、メモリが解放されます。


Dim c As Class1
Set c = New Class1

' 処理

Set c = Nothing ' インスタンスが破棄される

後始末

自作のクラスに対して後始末をそこまで気にする必要はありません。ローカル変数なら関数を抜けた時点で自動で後始末してくれます。

COM オブジェクトを使用しているときは必須です。

CreateObject 関数」を使用してインスタンス化したときは、必ず Nothing を設定する必要があります。忘れるとメモリが解放されなくなるため、不具合が発生します。

オブジェクト変数または With ブロック変数が設定されていません。

インスタンス化する前のクラスの変数の初期値は Nothing です。

インスタンス化していない状態で使用すると「エラー 91 オブジェクト変数または With ブロック変数が設定されていません。」が発生します。


Dim c As Class1 ' Nothing 状態

c.FirstName = "Tips" ' エラー

このエラーは VBA の中でよく発生するので、そのときはインスタンス化されているか確認します。

コンストラクタ

クラスのインスタンスを生成したときに実行されるコードを「コンストラクタ」と言います。逆にインスタンスが破棄されたときに実行されるコードを「デストラクタ」と言います。

VBA にはそれらに対応したイベントがあります。

コードの左上にある (General) から [Class] をクリックします。

3

コードの右上から [Initialize] または [Terminate] をクリックします。

上記の Class をクリックした時点で自動で Initialize が選択されます。
4

Initialize イベントを使うと、インスタンス化した時に変数の初期化などができます。イベントなのでコンストラクタに引数を渡すことはできません。

Terminate イベントを使うと、クラスの中で使用しているファイルなどを解放できます。


' クラスのコード
Private Sub Class_Initialize() ' Initialize イベント
    FirstName = "苗字"
    LastName = "名前"
End Sub

Private Sub Class_Terminate() ' Terminate イベント
    ' 後始末
End Sub

' 他のコード
Sub 実行()
    Dim c As Class1
    Set c = New Class1 ' Class_Initialize イベントが発生する

    Debug.Print(c.MyName) ' 苗字名前

    Set c = Nothing    ' Class_Terminate イベントが発生する
End Sub

プロパティ

プロパティとは高機能な変数みたいなものです。

クラスの変数に値を取得または設定するときに、それぞれのプロパティの関数を経由します。そこで値が不正でないかチェックしたり、初期値を取得したりできます。

Property Get プロパティ名() As 型名のように入力します。Get が取得するときに実行される関数です。Function 関数と同じように戻り値が取得される値になります。

Property Let プロパティ名(ByVal value As 型名)のように入力します。Let が設定するときに実行される関数です。引数 value に設定された値が渡されます。引数名は value 以外でも大丈夫です。


Private m_Name As String
       
Public Property Get Name() As String
    Name = m_Name
End Property

Public Property Let Name(ByVal value As String)
    m_Name = value
End Property

データ型がワークシートやクラスなどのオブジェクトのときは Let の代わりに Set を入力します。


Private m_Name As Class1
       
Public Property Get Name() As Class1
    Set Name = m_Name
End Property

Public Property Set Name(ByVal value As Class1)
    Set m_Name = value
End Property

Get と Let、または Get と Set で 1 つのプロパティです。実際に取得や設定される値は、同じような名前の変数を使用します。上記のコードでは m_Name です。一般的には_プロパティ名のような形式にしますが、VBA では先頭に記号を付けられないので m_ を付けています。


Dim c As Class1
Set c = New Class1

c.Name = "名前" ' Property Let Name が呼ばれる

Dim s As String
s = c.Name      ' Property Get Name が呼ばれる
Debug.Print(s) ' 名前

Get のみや Let のみにもできます。そのときは取得だけまたは設定だけできるプロパティになります。それぞれのスコープを Public と Private など組み合わせることもできます。

イベント

ワークシートに Change イベントがあるように、イベントを作成できます。

値型と参照型の違い

オブジェクトは参照型です。それ以外の Integer や String などは値型です。参照型を別の変数に代入したり、関数の引数に渡すときに値型と違いがあります。

  • 目次
    • クラスとは
    • クラスを追加する
    • コードを作成する
    • クラスを使用する
    • コンストラクタ
    • プロパティ
    • イベント
    • 値型と参照型の違い