【VBA】標準モジュール vs クラスモジュール:違いと使い分けの極意を徹底解説!
VBAをステップアップさせる鍵は、2つのモジュールの使い分けにあります。「いつものSub/Function」と「設計図としてのクラス」、それぞれの特徴を整理してみましょう。
1. 標準モジュール:どこでも使える「道具箱」
VBAを始めたときに書くコードのほとんどはここに入ります。「どこからでも呼べる関数や変数を置いておく場所」であり、特定の対象に縛られない汎用的な処理に向いています。
★ 性質:常にメモリ上に存在し、呼び出せばすぐに動く。
★ 状態:データの保持には不向き。変数は全体で共有されるため、意図しない書き換えのリスクがある。
★ 用途:マクロ記録の保存先、共通の計算(消費税計算など)、メインの実行フロー。
2. クラスモジュール:個性を生み出す「設計図」
こちらは「新しい『モノ(オブジェクト)』の作り方を定義する場所」です。実体(インスタンス)を生成して初めて機能する、プロフェッショナルな開発には欠かせないモジュールです。
ポイント:インスタンスごとに別々のデータを保持できる
例えば「Logger(記録係)」というクラスを作れば、ファイル出力用のLogger A、画面出力用のLogger Bといった具合に、同じ設計図から「個性の違う部品」を複数生み出せます。
3. 実践比較:コードで違いを体感する
' 名前を呼ぶだけで即実行可能
Public Sub CalcTax(price As Long)
MsgBox "税込価格は " & price * 1.1 & " 円です"
End Sub
【クラスモジュール:生み出して使う「部品」】
' クラス名: clsLogger
Private pName As String
Public Property Let LoggerName(val As String)
pName = val
End Property
Public Sub Log(msg As String)
Debug.Print "[" & pName & "] " & msg
End Sub
【呼び出し側:Newで実体化して個性を与える】
Sub Test()
Dim logA As New clsLogger
logA.LoggerName = "ファイル出力係"
Dim logB As New clsLogger
logB.LoggerName = "画面表示係"
logA.Log "保存完了" ' 結果:[ファイル出力係] 保存完了
logB.Log "保存完了" ' 結果:[画面表示係] 保存完了
End Sub
4. エンジニアの視点:どちらを選ぶべきか?
1. 判断の基準: 処理の「手順」や「共通の計算」をまとめたいなら標準モジュール、データと処理をセットにした「役割を持つ部品」を作りたいならクラスモジュールを選びます。
2. 保守性の違い: 大規模な開発では、何でも標準モジュールに書くとコードがスパゲッティ状態になります。役割ごとにクラス化(カプセル化)することで、影響範囲が限定され、修正に強い「いけいけ」なシステムが構築できます。
3. Javaエンジニアの感覚: 標準モジュールは static メソッドが集まった Utility クラス、クラスモジュールは通常の Class 定義そのものだと考えると、その設計意図がスッキリ理解できるはずです。
5. まとめ
最初は標準モジュールだけで十分かもしれません。しかし、複雑なツールを作る際には「これは何かの役割(クラス)にできないか?」と考える癖をつけてみてください。クラスモジュールを使いこなせたとき、あなたのVBAは単なる自動化ツールから、洗練された「ソフトウェア」へと進化します。