このサイトはアフィリエイトリンクを含んでいます
スポンサーリンク

Excel VBAでクラスモジュールを使いこなそう!オブジェクト指向の基礎をやさしく解説

Excel VBA AIで調べてみた
スポンサーリンク

こんにちは、ぼくはExcel VBAの活用が大好きで、これまで標準モジュールばかりを使って開発していました。しかし、あるとき「クラスモジュールを使うと複雑な作業がスッキリする」と聞いたものの、何がどう便利なのかイメージできずに混乱した経験があります。そんなとき、自分の中で「クラスモジュール」の扱い方やメリットを改めて整理したら、驚くほど理解が深まりました。この記事では「標準モジュール」と「クラスモジュール」の違いを踏まえながら、クラスモジュールを導入することで何が変わるのかを具体的なコード例を示しつつ紹介します。クラスモジュールを使いこなすと、大規模なプログラムでもデータと処理が整理され、保守が楽になります。少しでも興味を持った方は、この記事で疑問を解消してみてくださいね。


スポンサーリンク

クラスモジュールとは何か

Class

クラスモジュールは、一言でいえば「オブジェクトを作るための設計図」です。Excel VBAの世界では、標準モジュールに関数やSubを並べておく方法が一般的ですが、データと処理をひとまとめに扱う「オブジェクト指向」の考え方を取り入れたいときはクラスモジュールが便利です。ここでは、標準モジュールとの違いや、クラスモジュールを使うことで得られるメリットを整理します。

クラスモジュールと標準モジュールの根本的な違い

Sub
  • 標準モジュール
    • 主にプロシージャ(Sub)や関数(Function)を記述する場所です。呼び出したら一連の処理を実行し、完了後にメモリ上のデータは保持されにくいという特徴があります。
  • クラスモジュール
    • 「クラス」という単位で、プロパティ(変数のようなもの)やメソッド(SubやFunctionに相当)をまとめて記述します。クラスから生成された「オブジェクト(インスタンス)」は、自分専用のデータを内部に持ち続けながら、同じメソッドを呼び出せるという点が特徴です。

なぜクラスモジュールが便利なのか

  1. データと処理をセットで管理できる
    大きなプログラムでは、複数の値(プロパティ)を扱いながら、何度も同じ処理を呼び出す場面が増えます。クラスモジュールを使うと、その値と処理を“1つのまとまり”として扱えるため、後から作業内容を見直すときに理解しやすくなります。
  2. 複数のオブジェクトを独立して扱える
    例えば「複数のユーザーを同時に管理したい」「複数の商品の情報を同じ方法で計算したい」というケースがあります。クラスモジュールを使い、同じクラスから複数のインスタンス(オブジェクト)を作れば、各オブジェクトが別々のデータを持ちながら同じメソッドを実行できるので、管理がとても楽になります。
  3. 保守性が高い
    クラスモジュールにコードを分割すると、変更や拡張が必要なときに、そのクラスだけを修正すれば済むようになります。大規模なVBAプロジェクトであればあるほど、この分割によるメリットは大きいです。

クラスモジュールの基本構造

クラスモジュールを使うには、まずExcel VBAエディタ(VBE)で挿入する方法を知っておく必要があります。

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

  1. Excelを開いて [Alt + F11] キーでVBEを開きます。
  2. メニューバーの [挿入] → [クラスモジュール] をクリックします。
  3. プロジェクトエクスプローラーに「Class1」という新しいモジュールが作成されます。
  4. プロパティウィンドウ(F4キー)で「(Name)」欄を好みのクラス名(例:CarPersonなど)に変更します。

クラスモジュールの基本要素

クラスモジュール内には、以下を記述できます。

  • プロパティ(変数に相当)
    Public あるいは Private で宣言された変数。クラス内で扱うデータをここに保持させます。
  • メソッド(SubやFunctionに相当)
    クラスが実行する機能を定義します。プロパティの値を加工して返す処理をまとめておくと、扱いやすくなります。
Function

クラスモジュールを使った具体例

クラスモジュールの利点を実感するには、コード例を見るのがいちばん早いです。ここでは「商品」という概念をクラス化し、それぞれの価格や商品の説明を簡単に表示する例を紹介します。

クラスモジュールの中身(Itemクラスとする場合)

' クラスモジュール名:Item
Public 商品名 As String
Public 単価 As Currency
Public 在庫数 As Long

Public Function 商品情報を表示() As String
    商品情報を表示 = "商品名: " & 商品名 & vbCrLf & _
                     "単価: " & 単価 & "円" & vbCrLf & _
                     "在庫数: " & 在庫数 & "個"
End Function

ここでは、商品名単価在庫数 という3つのプロパティを作り、商品情報を表示() というメソッドで、それらの値をまとめて返しています。

標準モジュールからクラスを利用

Sub クラステスト()
    Dim 製品A As New Item
    Dim 製品B As New Item

    製品A.商品名 = "A-Widget"
    製品A.単価 = 1000
    製品A.在庫数 = 50

    製品B.商品名 = "B-Widget"
    製品B.単価 = 1200
    製品B.在庫数 = 30

    MsgBox 製品A.商品情報を表示()
    MsgBox 製品B.商品情報を表示()
End Sub

上記では、同じクラス Item からふたつのオブジェクト(製品A製品B)を作っています。片方に変更を加えても、もう片方には影響しないので、互いに独立した状態でデータを持てます。


クラスモジュールを活用するタイミング

複数の関連データをまとめたいとき

「ユーザーアカウント」「顧客情報」「商品情報」など、同じ項目を持つものが多数出てくる場面では、クラスモジュールが役に立ちます。フィールド(プロパティ)を定義しておけば、同じ形式で複数のオブジェクトを作りやすくなります。

重複処理を整理したいとき

標準モジュールが肥大化してくると、似たような処理があちこちに登場することがあります。クラスモジュールに共通の機能をまとめると、変更が必要になった際もコードの修正点をひとつに絞りやすくなり、保守性が向上します。

オブジェクト指向の概念を試したいとき

「なぜわざわざクラスを作るのか?」という疑問は、オブジェクト指向の考え方に触れてはじめてスッキリします。データを内包した状態のインスタンスを複数扱えるという仕組みは、プログラムを再利用可能にし、可読性を高める助けになります。


よくある疑問

標準モジュールでも変数をグローバルにすればデータを保持できるのでは?

確かに標準モジュールで Public 変数を宣言すれば、モジュール全体で扱える変数は作れます。しかし、それだけでは複数のオブジェクトごとに異なる値を持つことが難しく、管理範囲が広がりすぎます。クラスモジュールなら、生成するたびにプロパティを独立させられるので、同じ型のデータをいくつも作って並行処理しやすくなります。

そもそもオブジェクト指向がよくわからない

オブジェクト指向(Object Oriented)とは、モノ(オブジェクト)を中心にデータと機能を一緒に考える手法です。Excel VBAでも、WorkbookWorksheetRange などがすでにオブジェクトとして存在しています。自分のプロジェクト用にオリジナルのオブジェクトを作る手段がクラスモジュールと考えるとわかりやすいです。

使わないと困る?

小さなマクロや、一時的に使うだけのプログラムならクラスモジュールは必須ではありません。けれど、複数人で共同開発するときや、機能が増えて複雑になるときには役立ちます。特に複数のデータをスッキリまとめておきたい場面では、クラスモジュールによるメリットが大きいです。


まとめ

Excel VBAでは、標準モジュールで完結できる部分が多い一方、クラスモジュールを導入すると複数のオブジェクトを独立して扱えたり、データと処理を同じ場所で管理できたりといった利点が得られます。単純なマクロ作成から一歩進んで、もう少し整ったコードを書きたいと感じたときには、クラスモジュールを検討してみると便利です。

実際にクラスモジュールを使ってみると、クラス設計の考え方が身につくほか、整理整頓されたコードにするためのヒントが得られます。Excel VBAの標準モジュールだけでなく、クラスモジュールも柔軟に活用してみてください。

コメント

タイトルとURLをコピーしました