【ExcelVBA入門】クラスモジュールのメリット・使い方を徹底解説!

皆さんは、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は他にもいろいろ使い方がありまして、以下で詳しく解説しているので気になる方は見てみてくださいね!

【VBA入門】Functionの使い方(呼び出し、引数、戻り値)
更新日 : 2019年9月26日

クラスモジュールの応用的な使い方とは

ここまでは標準モジュールをクラスモジュールで書く方法をメインに紹介してきましたが、クラスモジュールを使うメリットは他にもたくさんあります。

メンバ変数、コンストラクタ・デストラクタ、アクセサの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を書く力が伸びます。

少しずつでもいいので使ってみて、ぜひ習得してくださいね!

LINEで送る
Pocket

ITエンジニアへ転職したい方におすすめ

自分を評価してくれる企業に転職して年収を上げたい! 自分のスキルにあった独自案件を知りたい!
エンジニアは今もっとも注目されている職業の1つ。エンジニアになって年収を増やしたい方や、あなたのスキルに見合った企業へ転職したいエンジニアの方も多いですよね。

しかし、大手の転職媒体は扱う求人数が多くても、誰もが登録しているので競争率もかなり高くなっています。そのため、あなたの条件に見合った企業を見つけても転職するためには、相応の努力とスキルが必要となります。

こういった媒体では、未経験からエンジニアを目指す方やエンジニア歴2〜3年で転職を考えている方にとって、最適な転職環境とはいえません。

そこでオススメしたいのが、未経験者や若手エンジニア向けの独自案件を多く掲載している「侍ワークス」です。

侍ワークスは、独自案件を多く掲載しているだけでなく、

・応募から就業まで一貫したサポート

・就業後もアフターフォロー

といった経験の浅い方や初めてエンジニアを目指す方にも安心のフォロー体制が整っています。もちろん登録は完全無料!しかも案件を見るだけなら登録も不要です。

まずは、お気軽にどんな求人があるか見てみてください。あなたにピッタリの企業がきっと見つかりますよ! 侍ワークスの求人情報を見る

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

新卒入社したメーカー系のIT企業で、システムエンジニアとして約5年勤務。
Webアプリ、業務アプリ開発において、要件定義、設計、インフラ、製造、テスト、運用保守など、様々な経験あり。
また、侍ブログ編集部として、これまでに200記事以上の記事を執筆。
現在はフリーランスエンジニア兼テックライターとして活動中。