忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【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は単なる自動化ツールから、洗練された「ソフトウェア」へと進化します。


PR