ExcelVBAでクラスモジュールを使うようになると、「Property Let」「Property Get」「Property Set」といった構文を目にするようになります。
これらは自分でプロパティを定義(作成)するための命令であり、VBAの中でも非常に重要な概念です。
プロパティを作成できるようになると、オブジェクト指向的なマクロ設計が可能になり、
「再利用性が高く、保守しやすいコード」を書けるようになります。
この記事では、VBAで独自のプロパティを作成する仕組みと使い方、実務での応用例を、初心者にもわかりやすく解説します。
目次
- ✅ そもそも「プロパティを作成する」とは?
- ✅ Propertyプロシージャの基本構文
- 🔹 基本構文
- ✅ サンプル①:基本的なプロパティの作成
- ✅ Property LetとProperty Getの仕組み
- ✅ Property Setの使い方(オブジェクト型のプロパティ)
- 例:Rangeオブジェクトをプロパティとして扱う
- ✅ 実務で役立つプロパティ設計の考え方
- ① クラスの内部状態を安全に管理できる
- ② オブジェクト間の連携をシンプルにする
- ③ 自動計算・連動処理も簡単に実装可能
- ✅ Property構文を使う際の注意点
- ✅ 応用例:社員情報クラスを作成して使う
- ■ まとめ:プロパティを作成して「再利用可能なVBA」を目指そう
✅ そもそも「プロパティを作成する」とは?
通常、VBAで扱う「プロパティ」とは、オブジェクト(セル・シート・ブックなど)が持っている属性のことです。
たとえば、次のようなものです。
Range("A1").Value = "テスト"
Sheets("集計").Name = "Report"
ここで「Value」や「Name」は既存のプロパティです。
では、「自分が作るプロパティ」とは何でしょうか?
それは、自分が定義したクラス(Class)に対して、独自のプロパティを付与することです。
これにより、Excelのオブジェクトのように「.(ドット)」でアクセスできる構造を作り出すことができます。
参考:【VBA】プロパティ一覧|意味・使い方・実務で覚えるべき基本と応用
✅ Propertyプロシージャの基本構文
VBAでプロパティを作成するには、クラスモジュール(Class Module)を使用します。
ここで定義できるプロシージャには3種類あります。
| 種類 | 役割 | データ型 | 使用例 |
|---|---|---|---|
| Property Get | 値を取得する | 任意 | 値 = オブジェクト.プロパティ名 |
| Property Let | 値を設定する(基本型) | String / Longなど | オブジェクト.プロパティ名 = 値 |
| Property Set | 値を設定する(オブジェクト型) | Object | Set オブジェクト.プロパティ名 = 別のオブジェクト |
🔹 基本構文
' 値の設定(基本型)
Public Property Let プロパティ名(引数 As 型)
変数 = 引数
End Property
' 値の取得
Public Property Get プロパティ名() As 型
プロパティ名 = 変数
End Property
たとえば「名前(Name)」というプロパティを自作する場合、次のように書きます。
✅ サンプル①:基本的なプロパティの作成
- クラスモジュールを追加
VBE(Visual Basic Editor)で「挿入」→「クラスモジュール」を選択。
名前を「clsPerson」に変更します。 - コードを記述
'--- clsPerson クラスモジュール ---
Private pName As String ' プロパティを保持する変数
' 値を設定する
Public Property Let Name(Value As String)
pName = Value
End Property
' 値を取得する
Public Property Get Name() As String
Name = pName
End Property
- 標準モジュールから利用する
Sub TestPerson()
Dim person As New clsPerson
person.Name = "山田"
MsgBox person.Name
End Sub
実行結果:「山田」と表示されます。
このように、自分で定義したNameプロパティをオブジェクトのように扱えるのがProperty構文の魅力です。
✅ Property LetとProperty Getの仕組み
上記のコードでは、「Let」と「Get」がセットで使われています。
それぞれの役割を簡単に整理しましょう。
| プロシージャ | 目的 | 例 |
|---|---|---|
| Property Let | 値を代入する | person.Name = "山田" |
| Property Get | 値を取得する | MsgBox person.Name |
VBA内部では「Let」で設定された値を「Get」で返す、という構造になっています。
つまり「pName」という変数が裏で値を保持し、それをプロパティ経由で操作しているのです。
✅ Property Setの使い方(オブジェクト型のプロパティ)
次に、「別のオブジェクトをプロパティとして保持する」場合を見てみましょう。
このときは「Property Set」を使います。
例:Rangeオブジェクトをプロパティとして扱う
'--- clsReport クラスモジュール ---
Private pTarget As Range
Public Property Set Target(r As Range)
Set pTarget = r
End Property
Public Property Get Target() As Range
Set Target = pTarget
End Property
呼び出し側では次のように使用します。
Sub TestReport()
Dim rep As New clsReport
Set rep.Target = Range("A1")
rep.Target.Value = "VBAプロパティ練習"
End Sub
このように、Range型・Workbook型などのオブジェクトを扱う場合は、
必ず「Set」を伴うProperty構文で作成します。
✅ 実務で役立つプロパティ設計の考え方
① クラスの内部状態を安全に管理できる
Property構文を使うことで、外部から直接変数をいじらせずに、内部状態を守る(カプセル化)ことができます。
例えば、次のように制限付きプロパティを作成することも可能です。
Private pAge As Integer
Public Property Let Age(Value As Integer)
If Value >= 0 Then
pAge = Value
Else
MsgBox "年齢に負の数は設定できません。"
End If
End Property
Public Property Get Age() As Integer
Age = pAge
End Property
これにより、誤った値の代入を防止できます。
クラス内部の整合性を保つためのバリデーション(値検証)を組み込める点が大きなメリットです。
② オブジェクト間の連携をシンプルにする
Property構文を使うと、他のオブジェクトを保持して動的に操作できます。
例:複数のセル範囲をまとめて管理するクラス
Private pRange As Range
Public Property Set Target(r As Range)
Set pRange = r
End Property
Public Sub Highlight()
pRange.Interior.Color = vbYellow
End Sub
利用例:
Sub HighlightRange()
Dim hr As New clsHighlighter
Set hr.Target = Range("A1:A5")
hr.Highlight
End Sub
これにより、複数の範囲を同一クラスのメソッドで処理できるようになります。
クラスを再利用できるため、開発効率が飛躍的に向上します。
③ 自動計算・連動処理も簡単に実装可能
Property Getの中で計算処理を入れると、
プロパティを参照するだけで自動的に値を返す“動的プロパティ”を作れます。
例:税込価格を自動計算するプロパティ
Private pPrice As Long
Public Property Let Price(Value As Long)
pPrice = Value
End Property
Public Property Get TaxIncludedPrice() As Long
TaxIncludedPrice = pPrice * 1.1
End Property
呼び出し:
Sub TestPrice()
Dim item As New clsItem
item.Price = 1000
MsgBox item.TaxIncludedPrice ' 1100 が表示
End Sub
このように、プロパティを通じて自動計算・変換・整形処理を行うことが可能です。
シート関数のように動作する「計算プロパティ」として活用できます。
✅ Property構文を使う際の注意点
- 通常の変数と混同しないこと
Property構文は「外部アクセス用の窓口」です。内部で保持する変数(pNameなど)と分けて管理しましょう。 - Letは省略可能
VBAでは「Property Let」は省略可能ですが、明示して書いた方が読みやすくなります。 - Setの付け忘れに注意
オブジェクト型を扱うときは、呼び出し側でも必ずSetを使用します。 - プロパティ名と変数名を区別する
内部変数にはpなどのプレフィックスをつける(例:pName, pRange)ことで、衝突を防げます。
✅ 応用例:社員情報クラスを作成して使う
最後に、実務でよく使われる「社員情報」を例に、複数のプロパティを持つクラスを作成してみましょう。
'--- clsEmployee クラスモジュール ---
Private pName As String
Private pDepartment As String
Private pSalary As Long
Public Property Let Name(Value As String)
pName = Value
End Property
Public Property Get Name() As String
Name = pName
End Property
Public Property Let Department(Value As String)
pDepartment = Value
End Property
Public Property Get Department() As String
Department = pDepartment
End Property
Public Property Let Salary(Value As Long)
If Value >= 0 Then
pSalary = Value
Else
MsgBox "給与は0以上で入力してください。"
End If
End Property
Public Property Get Salary() As Long
Salary = pSalary
End Property
Public Property Get AnnualIncome() As Long
AnnualIncome = pSalary * 12
End Property
使用例:
Sub TestEmployee()
Dim emp As New clsEmployee
emp.Name = "田中"
emp.Department = "営業部"
emp.Salary = 300000
MsgBox emp.Name & "(" & emp.Department & ")の年収:" & emp.AnnualIncome & "円"
End Sub
結果:
田中(営業部)の年収:3600000円
このように、プロパティを自作することで、業務ロジックを1つのオブジェクトとして整理できるようになります。
これが、VBAをより“開発言語”として使いこなすための大きな一歩です。
■ まとめ:プロパティを作成して「再利用可能なVBA」を目指そう
- プロパティは「オブジェクトの属性」を表すもので、
Property Let / Get / Setで自作できる - 値型はLet/Get、オブジェクト型はSet/Getを使う
- Property構文で「安全な値管理」や「自動計算」が実現できる
- クラスモジュールにまとめると、業務ごとに再利用しやすくなる
- 実務では、入力検証・自動集計・レポート生成などに応用可能
ExcelVBAを単なる“マクロツール”から“システム開発ツール”へと進化させる第一歩が、
このプロパティ作成(Property構文の理解)です。
理解が深まれば、あなたのVBAコードは一気に“プロフェッショナルレベル”に進化します。