VBAテクニック集 VBA一覧 その他の知識 プロパティ・メソッド解説

【VBA】プロパティを作成する方法|Property Let・Get・Setを徹底解説

ExcelVBAでクラスモジュールを使うようになると、「Property Let」「Property Get」「Property Set」といった構文を目にするようになります。
これらは自分でプロパティを定義(作成)するための命令であり、VBAの中でも非常に重要な概念です。

プロパティを作成できるようになると、オブジェクト指向的なマクロ設計が可能になり、
「再利用性が高く、保守しやすいコード」を書けるようになります。

この記事では、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値を設定する(オブジェクト型)ObjectSet オブジェクト.プロパティ名 = 別のオブジェクト

🔹 基本構文

' 値の設定(基本型)
Public Property Let プロパティ名(引数 As 型)
    変数 = 引数
End Property

' 値の取得
Public Property Get プロパティ名() As 型
    プロパティ名 = 変数
End Property

たとえば「名前(Name)」というプロパティを自作する場合、次のように書きます。


✅ サンプル①:基本的なプロパティの作成

  1. クラスモジュールを追加
    VBE(Visual Basic Editor)で「挿入」→「クラスモジュール」を選択。
    名前を「clsPerson」に変更します。
  2. コードを記述
'--- 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
  1. 標準モジュールから利用する
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」を使います。

参考:【VBA】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構文を使う際の注意点

  1. 通常の変数と混同しないこと
    Property構文は「外部アクセス用の窓口」です。内部で保持する変数(pNameなど)と分けて管理しましょう。
  2. Letは省略可能
    VBAでは「Property Let」は省略可能ですが、明示して書いた方が読みやすくなります。
  3. Setの付け忘れに注意
    オブジェクト型を扱うときは、呼び出し側でも必ずSetを使用します。
  4. プロパティ名と変数名を区別する
    内部変数には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コードは一気に“プロフェッショナルレベル”に進化します。

    -VBAテクニック集, VBA一覧, その他の知識, プロパティ・メソッド解説