皆さんは、VBAでクラスモジュールを使ったことがありますか?
クラスモジュールを使いこなせるようになると、オブジェクト指向をVBAに取り入れることができます。
控えめに言ってもコードの質がとても上がるので、使い方を覚えておくのがおすすめです!
ただ、クラスの概念が難しく使いこなせないと思っている方も多いのでは?
そこで今回は、
- クラスの基礎
- メンバ変数を使った変数の使い方
- コンストラクタ・デストラクタを使った変数の使い方
- アクセサを使った汎用的な変数の使い方
といった基礎から応用的な方法まで、徹底的に解説します!
クラスモジュールとは
クラスモジュールとは、標準モジュールと同じくVBAのコードを書く場所の一つです。
クラスモジュールを使うメリットは次の通りです。
- 変数の値をどこからでも書き換えられるリスクを減らすことができる
- どのモジュールの関数を実行しているか見ただけでわかるようになる
- 引数の数が多い関数を作りたい場合でも長い関数を使わなくてすむ
上記は一例ですが、クラスモジュールを使いこなすと速くメンテナンスに優れたコードを書くことができます。
※3については後程説明しますがメンバ変数、アクセサを使うことで関数の引数を減らすことができます。
クラスモジュールの基礎的な使い方とは
次にクラスモジュールの使い方について、簡単に紹介します。
クラスモジュールの追加方法
まず、クラスモジュールの作り方について説明します。
挿入タブからクラスモジュールを選択すると、新しいクラスモジュールを追加することができます。
標準モジュールとおなじく、クラスを開くとVBAのコードを書くウィンドウが表示されます。
クラスモジュールでSub・Functionを使う方法
標準モジュールと同じく、Sub、Functionを書くことができます。
オブジェクト名「Class1」のクラスモジュール:
Sub TestSub() MsgBox "Subを呼び出しました" End Sub Function TestFunction() as String TestFunction = "Functionを呼び出しました" End Function
標準モジュールと同じくSubの場合はCall、Functionの場合は変数に値を入れるような形で呼び出すことができます。
1点だけ違う点がありまして、呼び出す前にクラス宣言をしなければなりません。
Dim clsTest as Class1 Set clsTest = new Class1
上記を踏まえ、別のモジュールからクラスモジュールを呼び出す場合は、次のように書きます。
サンプルコード:
Sub test() 'クラス宣言 Dim clsTest As Class1 Set clsTest = New Class1 'Sub実行 Call clsTest.TestSub 'Function実行 Dim strMessage as String strMessage = clsTest.TestFunction Msgbox strMessage End Sub
「クラス宣言した際の変数.関数名」で関数を呼び出すわけですね。
「標準モジュールと同じ使い方もできる」とまずは思っていただければOKです。
ちなみに、Functionは他にもいろいろ使い方がありまして、以下で詳しく解説しているので気になる方は見てみてくださいね!
クラスモジュールの応用的な使い方とは
ここまでは標準モジュールをクラスモジュールで書く方法をメインに紹介してきましたが、クラスモジュールを使うメリットは他にもたくさんあります。
メンバ変数、コンストラクタ・デストラクタ、アクセサの3点です。
それぞれ説明しますね。
メンバ変数の使い方
最初は、メンバ変数の使い方です。
クラスモジュールの先頭かつ関数の外に書く変数のことです。
例えば、次のような感じですね。
Public strName As String Private strMessage As String Sub TestSub() MsgBox "Subを開きました" End Sub
Dimの代わりにPublic、Privateを書いたあと、型を付けて変数宣言をしています。
Publicの場合は次のように値取得、代入ができるようになります。
取得方法:
クラス宣言時の変数名.メンバ変数名
代入方法:
クラス宣言時の変数名.メンバ変数名 = 値
なお、Publicにしておくと「クラス宣言した変数名.メンバ変数名」で呼び出すことができますが、Privateはアクセサを使わなければ呼び出すことができなくなります。
値を変えられると困る変数の場合は、Privateにしてクラス内でのみ書き換えるように作ることもできるわけですね。
コンストラクタ・デストラクタの使い方
コンストラクタはクラス宣言時、デストラクタはクラス破棄時に呼び出される関数です。
コンストラクタとデストラクタは次のように書きます。
' クラスのコンストラクタ Private Sub Class_Initialize() End Sub ' クラスのデストラクタ Private Sub Class_Terminate() End Sub
省略可能なので必須ではないため、開始時・終了時に実行したい処理がある場合のみ使うのがおすすめです。
アクセサを使う方法
アクセサは先ほど説明した、Privateのメンバ変数にアクセスするための方法です。
Propertyを使ってGet、Letを書くことで、以下のようにデータ取得、書き換えを行うことができます。
クラスモジュール「Class2」:
'クラスのメンバ変数 Private Message_ As String '取得用アクセサ Property Get Message() As String Message = Message_ End Property '書換用アクセサ Property Let Message(new_Message As String) If Message_ = "" Then Message_ = new_Message Else Err.Raise 1000, Description:="一度設定した名前を変更することができません" End If End Property
標準モジュール:
Sub test2() 'クラス宣言 Dim clsTest As Class2 Set clsTest = New Class2 clsTest.Message = "1度目の設定" MsgBox clsTest.Message clsTest.Message = "2度目の設定" MsgBox clsTest.Message End Sub
また、この例では値を入れるLetに変数を一度設定すると書き換えできなくする処理をif文で追加しています。
このように、変数に値を入れるときに条件を追加できるのがアクセサを使うメリットでもあります。
逆に言うと、条件追加が不要の場合はメンバ変数をPublicにしたほうが無駄なアクセサを書く必要がないので、用途に応じて使い分けるのがおすすめです!
まとめ
今回は、VBAのクラスモジュールの使い方について解説しました。
慣れないうちは少し苦労するかもしれませんが、クラスを覚えると圧倒的にVBAを書く力が伸びます。
少しずつでもいいので使ってみて、ぜひ習得してくださいね!