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

皆さんは、VBAクラスモジュールを使ったことがありますか?
クラスモジュールを使いこなせるようになると、オブジェクト指向をVBAに取り入れることができます。

控えめに言ってもコードの質がとても上がるので、使い方を覚えておくのがおすすめです!

ただ、クラスの概念が難しく使いこなせないと思っている方も多いのでは?

そこで今回は、

  • クラスの基礎
  • メンバ変数を使った変数の使い方
  • コンストラクタ・デストラクタを使った変数の使い方
  • アクセサを使った汎用的な変数の使い方

といった基礎から応用的な方法まで、徹底的に解説します!

クラスモジュールとは

クラスモジュールとは、標準モジュールと同じくVBAのコードを書く場所の一つです。

クラスモジュールを使うメリットは次の通りです。

  • 変数の値をどこからでも書き換えられるリスクを減らすことができる
  • どのモジュールの関数を実行しているか見ただけでわかるようになる
  • 引数の数が多い関数を作りたい場合でも長い関数を使わなくてすむ


上記は一例ですが、クラスモジュールを使いこなすと速くメンテナンスに優れたコードを書くことができます。

※3については後程説明しますがメンバ変数、アクセサを使うことで関数の引数を減らすことができます。

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

次にクラスモジュールの使い方について、簡単に紹介します。

クラスモジュールの追加方法

まず、クラスモジュールの作り方について説明します。

挿入タブからクラスモジュールを選択すると、新しいクラスモジュールを追加することができます。

標準モジュールとおなじく、クラスを開くとVBAのコードを書くウィンドウが表示されます。

クラスモジュールでSub・Functionを使う方法

標準モジュールと同じく、SubFunctionを書くことができます。

オブジェクト名「Class1」のクラスモジュール:

Sub TestSub()
  MsgBox "Subを呼び出しました"
End Sub

Function TestFunction() as String
  TestFunction = "Functionを呼び出しました"
End Function

標準モジュールと同じくSubの場合はCallFunctionの場合は変数に値を入れるような形で呼び出すことができます。

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の代わりにPublicPrivateを書いたあと、型を付けて変数宣言をしています。

Publicの場合は次のように値取得、代入ができるようになります。

取得方法:

クラス宣言時の変数名.メンバ変数名

代入方法:

クラス宣言時の変数名.メンバ変数名 = 値

なお、Publicにしておくと「クラス宣言した変数名.メンバ変数名」で呼び出すことができますが、Privateはアクセサを使わなければ呼び出すことができなくなります。

値を変えられると困る変数の場合は、Privateにしてクラス内でのみ書き換えるように作ることもできるわけですね。

コンストラクタ・デストラクタの使い方

コンストラクタはクラス宣言時、デストラクタはクラス破棄時に呼び出される関数です。

コンストラクタとデストラクタは次のように書きます。

' クラスのコンストラクタ
Private Sub Class_Initialize()

End Sub

' クラスのデストラクタ
Private Sub Class_Terminate()

End Sub

省略可能なので必須ではないため、開始時・終了時に実行したい処理がある場合のみ使うのがおすすめです。

アクセサを使う方法

アクセサは先ほど説明した、Privateのメンバ変数にアクセスするための方法です。

Propertyを使ってGetLetを書くことで、以下のようにデータ取得、書き換えを行うことができます。

クラスモジュール「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

無料でSEからWebエンジニアへ転職しませんか?



侍エンジニア塾では、完全未経験の方から現在SEだけどプログラミングはやっていないという経験者まで、幅広い方々の人生を好転させるプログラミング指導を行ってきました。SEの方とお話していくなかで、

  • システムエンジニアという職業だけどコードが書けない
  • 事務作業が多くスキルがないため将来が不安
  • スクールに通うと完全未経験者と同じスタートになるからレベルが合わない
という、すでに知識があるSEならではのお悩みがあることに気づきました。そんな方におすすめなのが、弊社の「転職コース 」です。

弊社では、マンツーマンでレッスンを行いますので、現在お持ちの知識レベルからカリキュラムを作成いたします。さらにこちらの転職コースは無料で受講を始められて転職成功でそのまま卒業できるというとてもお得なコースとなっています。

既に知識のあるSEといっても転職は年齢が若いほど受かりやすいため、まずは無料体験レッスンで今の現状や理想の働き方について一緒に考えていきましょう。

まずは無料体験レッスンを予約する

書いた人

Sanshiro Wakizaka

Sanshiro Wakizaka

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

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説