【入門編】VBAで「クラスモジュール」を使い始める:オブジェクト指向でコードを部品化する第一歩 – Excel VBA解析バイブル

スポンサーリンク

標準モジュールの迷宮から脱出せよ:クラスモジュールで「Excel VBA」を設計する

こんにちは。日々、数万行のスパゲッティコードを解きほぐし、自動化の極致を追求しているエンジニアです。

君は今、標準モジュールに「Sub」を羅列し、グローバル変数に頼り切ったコードを書いていないだろうか? その状態は、いわば「台所のあらゆる道具を床にぶちまけて料理している」ようなものだ。規模が大きくなればなるほど、何がどこにあるのか分からなくなり、一つの変更が全体を破壊する恐怖に怯えることになる。

今日、君にはその混沌から抜け出し、「オブジェクト指向」という武器を手に取ってもらう。 クラスモジュールを使いこなせば、君のコードは「使い捨てのスクリプト」から「堅牢なシステム」へと進化する。

—

1. なぜ「クラス」が必要なのか?

標準モジュールは「手続き(手順書)」を書く場所だ。しかし、複雑な業務を自動化するとき、我々が本当に管理したいのは「手続き」ではなく「モノ(データと状態)」である。

例えば「請求書」という存在を考えてみてほしい。

  • データ: 請求先名、金額、発行日、明細行
  • できること: PDFを作成する、メールで送る、合計を計算する

これらをバラバラの関数で管理するのではなく、「請求書オブジェクト」としてひとまとめにする。これがクラスモジュールの本質だ。

—

2. クラスモジュールの作成:設計図を引こう

VBE(Visual Basic Editor)を開き、プロジェクトを右クリックして「挿入」→「クラスモジュール」を選択しよう。名前を `Invoice` に変えてほしい。

これが「請求書の設計図」になる。

‘ クラス名: Invoice
‘ データ(プロパティ)を定義する
Public CustomerName As String
Public Amount As Long

‘ このオブジェクトが持つ機能(メソッド)
Public Sub PrintSummary()
‘ 自分自身のデータを使って処理を行う
MsgBox “宛先: ” & Me.CustomerName & vbCrLf & _
“金額: ” & Format(Me.Amount, “#,

0″) & “円”

End Sub

ここがポイント

  • `Public` 変数: 外部から直接値を代入・参照できる「フィールド」。
  • `Me` キーワード: 「自分自身」を指す強力なポインタだ。これを使うことで、オブジェクトは自分自身のデータにアクセスできる。

—

3. 実践:クラスを「実体化」して使う

設計図ができたら、次は標準モジュールでそれを「実体化(インスタンス化)」する。ここが一番のつまずきポイントだが、一度覚えれば一生モノの知識だ。

‘ 標準モジュールでの利用例
Sub CreateInvoiceTest()
‘ 1. オブジェクトを格納する変数を用意
Dim myInvoice As Invoice

‘ 2. 設計図から実体を生成(ここが重要!)
Set myInvoice = New Invoice

‘ 3. データをセット
myInvoice.CustomerName = “株式会社テックラボ”
myInvoice.Amount = 500000

‘ 4. 機能(メソッド)を呼び出す
myInvoice.PrintSummary

‘ 5. メモリを解放(厳密には自動で消えるが、明示すると安心)
Set myInvoice = Nothing
End Sub

なぜこれが強力なのか?

もし「請求書」が100枚あっても、この `myInvoice` 変数を配列やコレクションに入れるだけで、すべての請求書を整然と管理できる。標準モジュールだけでこれをやろうとすると、多次元配列や複雑な変数管理で地獄を見ることになるはずだ。

—

4. 初学者が陥りやすい「落とし穴」

クラスモジュールを使い始めると、必ず以下のエラーに直面する。

  • 「オブジェクト変数または With ブロック変数が設定されていません (エラー 91)」
  • 原因:`Set … = New …` を忘れている。家を建てる前に住もうとしている状態だ。必ず `New` で実体を作ること。
  • プロパティの書きすぎ
  • 初期のうちは、変数を `Public` にしてもいい。だが、慣れてきたら `Private` 変数と `Property Let/Get` を使って「読み取り専用」にしたり「入力チェック」を挟んだりしよう。これが「カプセル化」の第一歩だ。

—

最後に:君のコードを「部品」に変えよう

クラスモジュールの魅力は、「一度作れば、別のExcelファイルにインポートするだけで即戦力になる」というポータビリティにある。

君がこれまで苦労して書いた「メール送信ロジック」や「ログ出力ロジック」をクラスに書き直してみよう。そうすれば、君のVBAライブラリは爆発的に洗練され、開発時間は劇的に短縮されるはずだ。

クラスという概念は、最初は少し抽象的で難しく感じるかもしれない。だが、ここをクリアすれば、君はもう「マクロの記録」に頼るだけのユーザーではない。Excelを意のままに操るアーキテクトだ。

さあ、エディタに戻って、君の最初のクラスを設計してみよう。分からないことがあれば、いつでもまた聞きに来てほしい。応援しているよ。

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