クラスモジュールとは? クラスを自作するときに必要なもの

VBAでの「クラス」は「クラスモジュール」のことを指します。これは、標準モジュールとは異なり、自分で追加して設計する必要があります。

マクロの記録機能を使った場合は「標準モジュール」が自動で作成され、そこにコードも自動生成されますが、クラスは自動生成はされません。手動でクラスモジュールを追加し、プロパティやメソッドなどを自分で定義していきます

VBAでコードが複雑になってくると、「データを扱う際に複数の処理が必要になり面倒」「データ用の変数や処理関数が散らばっていて管理が大変」などと感じることがあります。

そんなときに役立つのが「クラスモジュール」です。

この記事では、そのクラスモジュールの追加方法と、プロパティやメソッドといった基本的な使い方を紹介します。

なお、クラスとは何かについては「【VBAクラス入門】第1回:VBAにおけるクラスとは?」をご参照ください。

クラスと関数の違いは? クラスは冷蔵庫、関数は電子レンジと例えると理解しやすい

VBAでは「クラスモジュール」と「クラス」は大体同じ意味で使われます。モジュールであることを明示したい場合のみ「クラスモジュール」と言いますが、それ以外では「クラス」と言うことがほとんどです。

その「クラス」ですが、「クラス」という名前だけを見ると、難しそうに感じるかもしれません。

でも、要はクラスとは「冷蔵庫」のようなものだと考えると分かりやすいです。

冷蔵庫には中に食材が入っていますよね。これはクラスが持つ“データ”です。そして、「食材を追加する」「取り出す」といった操作ができます。これが“メソッド”です。また、「中身を確認する」という状態の確認を行うことができます。これが”プロパティ”です。冷蔵庫がその中身を覚えていてくれるように、クラスも自分のデータを持ち、繰り返し使うことができます。

また、必要であれば冷蔵庫を増やすことも可能です。野菜用冷蔵庫、飲料用冷蔵庫、のようにデータの種類で使い分けが可能になります。

このようにデータを自分で持っており、データの操作や参照を外部から行うことができ、さらに丸ごと複製できるのがクラスです

一方で、標準モジュールで作る関数は、「電子レンジ」のようなものです。

冷凍食品というデータを入れてスタートボタンを押すと、一定時間後に「チン」と音が鳴って温めが完了します。

中からは温かい食品になって出てきますが、電子レンジの中には何も残りません。これは関数と同じで、「入力 → 処理 → 出力」で終わり。データは保持しません

このように、クラスは「データを持つことができる」のが大きな特徴です。

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

クラスモジュールの追加はVBAエディター上で行います。

なお、VBA画面はExcelブックを開いた状態で、開発タブ→Visual Basicで開きます。Alt + F11キーでも開きます。

もし開発タブが無い場合は、ファイルタブ→オプション→Excelのオプションダイアログ→リボンのユーザー設定→右側ウィンドウの「開発」にチェックを付けると表示されるようになります。手順詳細は「Excelのマクロとは」ページの下段にある「マクロを使う方法」をご参照ください。

  1. VBA画面でクラスモジュールを追加したいブックを選択し、挿入メニュー → クラスモジュール、を選択します。(ブックを右クリックして、挿入 → クラスモジュール でもOKです)
  2. クラス モジュールフォルダと Class1 が追加されます。これでクラスモジュールの追加が出来ました。なお、既にクラスモジュールが存在している場合は、Class2、Class3 と連番の名前で追加されます。
  3. 次に、Class1の名前を変更していきます。まずは、表示メニュー → プロパティウィンドウ を選択して、プロパティウィンドウを表示します。F4キーでも表示されます。
  4. プロパティウィンドウの(オブジェクト名)に書いてある Class1を別の名前に変更します。(オブジェクト名)とありますが、これはクラス名のことを指しています。クラス名には「そのクラスが何をするのか」を表す名前を付けます。ここでは仮に冷蔵庫を意味する「Refrigerator」とします。オブジェクト名を変更すると、上のクラスモジュールフォルダにあるクラスの名前も変わります。

ここまでが、クラスモジュールの追加になります。VBAでは1つのクラスモジュールが、1つのクラスになります。追加したクラスモジュールの中に複数のクラスを作ることはできません。

クラスモジュールの名前をClass1からRefrigeratorに変更しましたが、これは実際にこのクラスを使う際に「Refrigerator」という名前でコーディングをすることになります。

Class1やClass2という名前だとクラス名からどういうクラスなのか分かりません。そのため、Class1のままでいいのはお試し用のコードを書くときぐらいで、通常はクラスモジュール名の変更を行うのは必須と思ってください。

クラスの基本構成とは? プロパティとメソッド

クラスにはプロパティとメソッドの2つを用意します。

プロパティとはクラスが保持するデータの状態を操作したり参照する関数のことを指します。一般的に「プロパティ」という言葉はWindowsでは「設定」というような意味になりますが、クラスの場合はクラスが保持しているデータを参照したり、差し替えたりするような場合の操作を行う関数を「プロパティ」と言います。冷蔵庫の「中身を確認する」プロパティであれば、引数で指定された食品の状態を確認してそれを返します。例えば、「中身を確認する。引数はりんご」→戻り値=りんごは入ってない、というような使い方になります。

プロパティには以下のような種類があります。aaa,bbb,cccの部分は任意のプロパティ名(関数名)になります。

  • Property Let aaa:値型データの書き換え(代入)用
  • Property Set bbb:オブジェクト型のデータの代入用
  • Property Get ccc;値の参照(取得)用

メソッドとは、クラスが保持するデータをさらに追加したり、削除したり、加工して取り出したり、といったデータ自体を扱う際の命令を指します。標準モジュールでの関数と大体同じですが、扱うデータはクラスが保持しているという点が異なります

プロパティとメソッドにはPrivateやPublicが付いています。Privateの関数は外部からは利用できませんが、Publicは利用できます。クラスを設計する場合、どうしても公開するものに限りPublicを付け、そうでないものはPrivateとするのが望ましいです。

冷蔵庫クラスの実装例

では上記の冷蔵庫クラス(Refrigerator.cls)を実際に書いてみます。

冷蔵庫の中身を確認するプロパティ(Contents)、食材を追加するメソッド(AddItem)、食材を取り出すメソッド(TakeItem)を用意して、食材データを扱います。

クラスで重要なことは、データの取り扱いを行うタイミングは、外部からの指示による、という点です。

クラスが勝手に自分のタイミングでデータを扱うことはしません。実際の冷蔵庫が勝手に食材を入れたり出したりしないのと同じです。

冷蔵庫クラスを操作する関数例

では、冷蔵庫クラスを操作する関数を標準モジュールやワークシート(Sheet1など)に書く場合は以下のようになります。

データを持つ自作クラスを使うときはNewで領域を確保する必要があります。データを持たないクラスの場合はNewは不要になることもありますが、それは別記事でお話します。繰り返しますが、データを持つクラスの場合はNewを付けます。

あとは、AddItemメソッドで食材を追加し、Contentsプロパティで食材の確認を行い、TakeItemメソッドで食材を取り出しています。

このように、クラスのデータを扱うのはこの関数のようにクラスを使う側が行います。