【入門編】クラスモジュールにおけるProperty Get/Let/Setの使い分けとカプセル化の真髄 – Excel VBA解析バイブル

スポンサーリンク

Excel VBAを掌握する極限の知見:クラスモジュールと「プロパティ」がもたらす真の堅牢性

こんにちは。自動化の現場で血肉を削ってきたエンジニアとして、今日は君たちに「VBAの脱・初心者」を果たすための最も重要な扉を開いてもらおうと思う。

「マクロの記録」から一歩踏み出し、多くの人が直面するのは「変数があちこちで書き換えられて、どこでバグが発生したか分からない」というカオスだ。これを解決し、プログラムに「意思」を持たせるのが、今回解説するクラスモジュールとプロパティプロシージャだ。

1. なぜ「変数」をそのまま公開してはいけないのか?

VBAの標準モジュールで `Public x As Long` と書くのは、言ってみれば「会社の金庫を誰でも開けられる状態」にしておくようなものだ。誰がいつ、どんな値を放り込むか分からない。

クラスモジュールを使う目的は、「データの番人(ガードマン)」を置くことにある。それが `Property` プロシージャだ。

プロパティの3つの顔

  • Property Get: 値を「取り出す」(閲覧専用にできる)
  • Property Let: 値を「書き込む」(不正な値が入らないよう検閲できる)
  • Property Set: オブジェクトを「セットする」(セル範囲や他のクラスなど)

2. 実践:クラスモジュール「Employee」の設計

社員情報の管理を例にしよう。年齢にマイナス値が入るようなおかしなデータは、プログラムの根幹を揺るがす。これを食い止めるのがカプセル化だ。

手順:クラスモジュール `C_Employee` を作成する

‘ — クラスモジュール: C_Employee —
Option Explicit

‘ 内部で隠蔽する変数(Privateで定義)
Private pAge As Long
Private pName As String

‘ 【Property Let】値の書き込み時に「検閲」を行う
Public Property Let Age(ByVal value As Long)
‘ ここでガードマンの仕事をする
If value < 0 Or value > 150 Then
Err.Raise vbObjectError + 1, , “年齢は0〜150の間で指定してください。”
End If
pAge = value
End Property

‘ 【Property Get】値を取り出す(読み取り専用にすることも可能)
Public Property Get Age() As Long
Age = pAge
End Property

‘ 名前は書き込み・読み取り可能に
Public Property Let Name(ByVal value As String)
pName = value
End Property

Public Property Get Name() As String
Name = pName
End Property

3. なぜこれが「最強」なのか?

この設計には、ただの変数宣言にはない3つの恩恵がある。

1. 整合性の担保: `pAge` は `Private` なので、外部から直接書き換えられない。必ず `Property Let` を通るため、不正な値を確実に弾ける。
2. メンテナンス性: 将来「年齢が更新されたらログを出力したい」となった場合、`Property Let` の中にコードを一行足すだけで、アプリ全体に適用される。
3. 予測可能性: どこで値が変更されたかを追いかけやすくなる。これが大規模開発における「安心感」の正体だ。

4. クラスを呼び出す側のコード

では、このクラスを標準モジュールでどう使うか見てみよう。

‘ — 標準モジュール: Main —
Sub TestEmployee()
Dim emp As C_Employee
Set emp = New C_Employee

‘ プロパティへの代入(内部でバリデーションが走る)
emp.Name = “田中”
emp.Age = 30

‘ emp.Age = -5 ‘ ここで実行するとエラーになり、バグの混入を防げる!

Debug.Print emp.Name & “さんは” & emp.Age & “歳です。”
End Sub

5. 初学者が陥りやすい罠とアドバイス

  • 罠1:全部 `Public` にしてしまう
  • 最初からクラスを使おうとせず、全てをパブリック変数にする人がいる。これではクラスを使う意味が半減する。`Private` と `Property` のセットこそが本質だ。
  • 罠2:SetとLetの混同
  • 基本ルールはこうだ。「数値や文字列はLet」「オブジェクト(Range, Worksheet, 他のクラス)はSet」。これさえ守れば迷うことはない。
  • 罠3:過剰設計
  • 単純なマクロにクラスは不要だ。しかし、データ構造が複雑になり、複数のモジュールでデータを回すようになったら、その時こそがクラスの出番。タイミングを見極めよう。

最後に:プロのエンジニアへの道

プログラミングとは、単に動くコードを書くことではない。「未来の自分が、あるいは他人が読んだときに迷わない、壊れない仕組みを作ること」だ。

今日学んだ `Property` の使い分けは、そのための強力な武器になる。まずは小さなクラスから、自分で「ガードマン」を配置する感覚を掴んでみてほしい。

ここをクリアすれば、君のVBAコードは「ただのスクリプト」から「堅牢なソフトウェア」へと進化する。応援しているよ。何か詰まったら、いつでもまた聞きに来るといい。

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