VBAでクラスモジュールを学ぼうとすると、多くの人が最初につまずきます。
「クラスを作ったけど、どう呼び出せばいいのか分からない」「変数との違いが曖昧」「結局どんな場面で使うのか分からない」と感じた経験はないでしょうか。
実務では、クラスを難しい仕組みとして理解する必要はありません。重要なのは、クラスは“特別なもの”ではなく、オブジェクトを入れるための変数設計だと理解することです。
この記事では、クラスモジュールを「オブジェクト変数」という視点で整理し、どう定義し、どう呼び出し、どう使うと実務で壊れにくくなるのかを解説します。
「とりあえず動いた」から一段上の、再利用できるVBA設計を目指す方に向けた内容です。
目次
- ✅ クラスモジュールとは何か|「変数の型を自分で作る」仕組み
- ・通常の変数とクラスの違い
- ✅ クラスモジュールの基本構成|プロパティとメソッド
- ・クラスモジュールの例(UserInfoクラス)
- ✅ クラスはオブジェクト変数として使う|DimとSetの意味
- ・オブジェクト変数として宣言する
- ・プロパティに値をセットする
- ✅ クラス変数を使うメリット|処理とデータをまとめられる
- ・クラスを使わない場合の問題点
- ・クラスを使った場合の改善
- ✅ クラスを複数インスタンスで使う|配列・Collectionとの相性
- ・Collectionで複数のクラスを管理する例
- ✅ クラスを使うべき場面・使わなくていい場面
- ・クラスを使うべき場面
- ・クラスを使わなくていい場面
- ✅ 実務で壊れにくくする設計ポイント
- ✅ 応用:クラスは「処理の単位」を変数にする技術
- ✅ まとめ:クラスは「難しい技術」ではなく「変数設計」
✅ クラスモジュールとは何か|「変数の型を自分で作る」仕組み
クラスモジュールを難しく感じる原因は、「オブジェクト指向」という言葉から入ってしまうことにあります。
しかし実務的には、クラスは自分で定義できるデータ型(変数の型)と考えると理解しやすくなります。
通常の変数は、Long や String など、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つのクラスで表す」ところから始めてみてください。