VBAテクニック集 VBA一覧 オブジェクト変数 文法・構文

【VBA】クラスモジュールの使い方を解説|オブジェクト変数としての正しい呼び出し方

VBAでクラスモジュールを学ぼうとすると、多くの人が最初につまずきます。
「クラスを作ったけど、どう呼び出せばいいのか分からない」「変数との違いが曖昧」「結局どんな場面で使うのか分からない」と感じた経験はないでしょうか。
実務では、クラスを難しい仕組みとして理解する必要はありません。重要なのは、クラスは“特別なもの”ではなく、オブジェクトを入れるための変数設計だと理解することです。
この記事では、クラスモジュールを「オブジェクト変数」という視点で整理し、どう定義し、どう呼び出し、どう使うと実務で壊れにくくなるのかを解説します。
「とりあえず動いた」から一段上の、再利用できるVBA設計を目指す方に向けた内容です。

✅ クラスモジュールとは何か|「変数の型を自分で作る」仕組み

クラスモジュールを難しく感じる原因は、「オブジェクト指向」という言葉から入ってしまうことにあります。
しかし実務的には、クラスは自分で定義できるデータ型(変数の型)と考えると理解しやすくなります。
通常の変数は、LongString など、Excel VBAが用意した型しか使えません。
クラスを使うと、「業務用の変数の型」を自分で定義できます。
ここを理解しないまま使うと、プロパティやメソッドの意味が分からず、後で困ることになります。


・通常の変数とクラスの違い

通常の変数

  • 数値や文字列を直接保持する
  • 処理が増えると変数が散らばりやすい

クラスを使った変数

  • 関連する値や処理を1つにまとめられる
  • 「1つの業務単位」を変数として扱える

この違いが、実務での保守性に直結します。


✅ クラスモジュールの基本構成|プロパティとメソッド

クラスモジュールには、主に次の2つを定義します。

  • プロパティ:オブジェクトが持つ情報
  • メソッド:オブジェクトが行う処理

まずは、「値を持つ変数」としてのクラスから見ていきます。


・クラスモジュールの例(UserInfoクラス)

Option Explicit

Private pUserName As String
Private pAge As Long

Public Property Get UserName() As String
    UserName = pUserName
End Property

Public Property Let UserName(ByVal value As String)
    pUserName = value
End Property

Public Property Get Age() As Long
    Age = pAge
End Property

Public Property Let Age(ByVal value As Long)
    pAge = value
End Property

なぜこの書き方か
内部変数(pUserName など)を Private にすることで、
外部から直接書き換えられない安全な構造になります。
別案として Public 変数にする方法もありますが、実務では変更に弱くなるため、プロパティ経由を基本にします。


✅ クラスはオブジェクト変数として使う|DimとSetの意味

クラスを使うとき、最初に混乱しやすいのが
Dim と Set の役割の違いです。
ここを曖昧にしたまま進むと、エラーやメモリ解放漏れの原因になります。


・オブジェクト変数として宣言する

Dim user As UserInfo
Set user = New UserInfo
  • Dim:変数を宣言する
  • Set:オブジェクトを代入する

クラスは 必ず Set が必要 です。
これは、クラスが「値」ではなく「参照」を扱うためです。


・プロパティに値をセットする

user.UserName = "佐藤"
user.Age = 30

ここでは、通常の変数と同じ感覚で使えます。
この「普通に使える感覚」が、クラスを変数として扱う最大のメリットです。

クラスをオブジェクト変数として使うときに混乱しやすいのが、
Dim と Set の役割の違いです。
ここを曖昧にしたままだと、
エラーや意図しない挙動の原因になります。
値型・参照型の違いも含めて整理した解説は、こちらでまとめています。
【VBA】SetとDimの違いを使い方と一緒にわかりやすく比較


✅ クラス変数を使うメリット|処理とデータをまとめられる

クラスを使わずに処理を書くと、
関連する変数がモジュール内に散らばりやすくなります。
その結果、「この変数はどこで使っているのか分からない」状態になりがちです。


・クラスを使わない場合の問題点

  • 引数が増え続ける
  • 処理の意図が読み取りにくい
  • 仕様変更時に影響範囲が分からない

・クラスを使った場合の改善

  • 1つの変数に意味が集約される
  • 処理の責務が明確になる
  • 再利用しやすくなる

クラスは「高度な技術」ではなく、
変数整理のための道具として使うのが実務向きです。


✅ クラスを複数インスタンスで使う|配列・Collectionとの相性

実務では、同じ構造のデータを複数扱うことが多くあります。
クラスは、複数インスタンスを作れる点が大きな強みです。


・Collectionで複数のクラスを管理する例

Public Sub Sample_ClassCollection()
    Dim users As Collection
    Set users = New Collection
    
    Dim user As UserInfo
    
    Set user = New UserInfo
    user.UserName = "田中"
    user.Age = 25
    users.Add user
    
    Set user = New UserInfo
    user.UserName = "鈴木"
    user.Age = 40
    users.Add user
End Sub

実務ポイント

  • ループ処理との相性が良い
  • 配列よりも柔軟に扱える
  • 業務データをオブジェクト単位で管理できる

クラスを複数インスタンスで扱えるようになると、
VBAの設計は一気に実務向きになります。
ただ、その前提として
「インスタンスとは何か」「New で何が起きているのか」 を理解しておくことが重要です。
インスタンス化の意味と使いどころは、こちらで整理しています。
【VBA】クラスのインスタンス化の意味・設定方法・使いどころ


✅ クラスを使うべき場面・使わなくていい場面

クラスは便利ですが、何でもかんでも使うと逆に複雑になります。
ここでは、実務での判断基準を整理します。


・クラスを使うべき場面

  • 複数の値が常にセットで動く
  • 同じ構造のデータを複数扱う
  • 処理の責務を分離したい

・クラスを使わなくていい場面

  • 一時的な計算だけ
  • 1回しか使わない処理
  • 値が1つだけの単純処理

判断の軸は、「その変数に名前を付けたいかどうか」です。


✅ 実務で壊れにくくする設計ポイント

クラスを使うときは、次の点を意識すると事故が減ります。

  • クラス名は業務用語に近づける
  • プロパティは最小限にする
  • 処理を詰め込みすぎない
  • New と Set の場所を明確にする

クラスは「万能ツール」ではなく、
設計を整理するための部品です。


✅ 応用:クラスは「処理の単位」を変数にする技術

慣れてくると、クラスは

  • 値を持つ箱
  • 処理を持つ箱

の両方として使えるようになります。
これにより、「処理のかたまり」を1つの変数として扱えるようになります。

これは、

  • 大きくなりがちなプロシージャの分割
  • 再利用可能な業務ロジックの切り出し

につながります。


 

✅ まとめ:クラスは「難しい技術」ではなく「変数設計」

  • クラスは自分で作る変数の型
  • オブジェクト変数として Dim / Set で扱う
  • プロパティで値を安全に管理する
  • Collectionと組み合わせると実務で強い
  • 使いどころを選ぶことで保守性が上がる

クラスモジュールは、
「使いこなせる人だけの高度な技術」ではありません。
変数を整理し、意味を持たせるための実務ツールです。
まずは「1つの業務データを1つのクラスで表す」ところから始めてみてください。

    -VBAテクニック集, VBA一覧, オブジェクト変数, 文法・構文