【VBA】ゲッター・セッターの使い方【クラスモジュール】
目次
クラスモジュールの概要
VBA(Visual Basic for Applications)では、クラスモジュールを使用することで、自分だけのオブジェクト(クラス)を定義できます。クラスモジュールは、オブジェクト指向プログラミングの基本概念である「カプセル化」や「抽象化」を実現するためのものです。クラス内にメソッド(処理)とプロパティ(データ)を定義し、外部からそのクラスのインスタンス(オブジェクト)を生成して利用することができます。
クラスモジュールは、Excel VBAの「挿入」メニューから「クラスモジュール」を選択することで作成できます。作成後は、標準モジュールとは異なり、オブジェクト指向の考え方に沿ったプログラムを組むことが可能になります。
プロパティの役割
クラスモジュール内では、クラスが持つ状態(データ)を表すために「プロパティ」を使用します。プロパティは、クラス内のプライベートな変数(メンバ変数)へのアクセスをカプセル化するための仕組みであり、直接変数にアクセスするのではなく、専用の手続き(メソッド)を通して値を読み書きすることができます。
VBAでは、プロパティを扱う際に「Property Get」「Property Let」「Property Set」という3種類のプロシージャを使用します。これらを適切に使い分けることで、データの取得や変更の際に追加の処理(例:入力チェック、ログ出力、他の変数の自動更新など)を実装することができます。
Property Get の使い方
Property Get は、クラスのプロパティの値を外部から取得するために使用されます。内部のプライベート変数の値を返すとともに、必要に応じて計算処理や整形処理を行った結果を返すこともできます。
例として、名前を管理するプロパティの「Name」を定義する場合のコードは以下の通りです。
' クラスモジュール: clsPerson
Private mName As String
Public Property Get Name() As String
Name = mName
End Property
この例では、プライベート変数 mName
の値を外部から読み出すために、Property Get Name
を使用しています。外部から obj.Name
として値を取得すると、このプロシージャが実行されます。
Property Let の使い方
Property Let は、数値や文字列などの基本データ型のプロパティに値を代入するために使用されます。代入処理の際に、入力値のチェックや値の整形などの処理を行うことも可能です。
先ほどの例に続いて、Name
プロパティに値を設定するための Property Let
の例は以下の通りです。
' クラスモジュール: clsPerson
Private mName As String
Public Property Let Name(ByVal Value As String)
' 必要なら値の検証や整形処理をここに記述
mName = Value
End Property
このコードにより、外部から obj.Name = "山田太郎"
とすると、Property Let Name
が呼び出され、プライベート変数 mName
に “山田太郎” が設定されます。
Property Set の使い方
Property Set は、オブジェクト型のプロパティに対して値を設定する場合に使用されます。オブジェクトをプロパティとして持たせたい場合、単純な代入ではなく Set
キーワードを使用して値を設定する必要があります。
例えば、部下の情報を保持するオブジェクトプロパティ Manager
を持つ場合のコードは以下の通りです。
' クラスモジュール: clsEmployee
Private mManager As clsEmployee
Public Property Get Manager() As clsEmployee
Set Manager = mManager
End Property
Public Property Set Manager(ByVal Value As clsEmployee)
' オブジェクトを代入する際は必ず Set を使用
Set mManager = Value
End Property
この例では、clsEmployee
型のオブジェクトをプロパティとして扱っており、Property Get
と Property Set
を用いて値の取得と代入を行っています。外部からは obj.Manager = 他のEmployeeObj
のように代入できます。
具体的な例
ここでは、実際にクラスモジュールを利用して、人物情報を管理するシンプルな例を示します。クラス clsPerson
は、名前と年齢という2つのプロパティを持ちます。
' クラスモジュール: clsPerson
Private mName As String
Private mAge As Integer
' 名前の取得
Public Property Get Name() As String
Name = mName
End Property
' 名前の設定(文字列の場合は Let を使用)
Public Property Let Name(ByVal Value As String)
' ここで入力チェックが可能(例:空文字のチェックなど)
If Value = "" Then
Err.Raise vbObjectError + 1, "clsPerson", "名前は空にできません。"
Else
mName = Value
End If
End Property
' 年齢の取得
Public Property Get Age() As Integer
Age = mAge
End Property
' 年齢の設定(数値の場合は Let を使用)
Public Property Let Age(ByVal Value As Integer)
' 年齢の範囲チェック(0~150歳)
If Value < 0 Or Value > 150 Then
Err.Raise vbObjectError + 2, "clsPerson", "年齢は0から150の間でなければなりません。"
Else
mAge = Value
End If
End Property
この例では、Property Let
内でエラーチェックを行い、入力値が不正な場合はエラーを発生させています。これにより、オブジェクトの状態が常に有効な状態に保たれるようになっています。
発展的な例
クラスモジュールでは、プロパティ以外にもメソッドやイベントを組み合わせて、より複雑な動作を実現できます。以下は、内部で計算処理を行い、計算結果をプロパティとして返す例です。
' クラスモジュール: clsRectangle
Private mWidth As Double
Private mHeight As Double
' 横幅の取得・設定
Public Property Get Width() As Double
Width = mWidth
End Property
Public Property Let Width(ByVal Value As Double)
If Value <= 0 Then
Err.Raise vbObjectError + 3, "clsRectangle", "横幅は正の数でなければなりません。"
Else
mWidth = Value
End If
End Property
' 高さの取得・設定
Public Property Get Height() As Double
Height = mHeight
End Property
Public Property Let Height(ByVal Value As Double)
If Value <= 0 Then
Err.Raise vbObjectError + 4, "clsRectangle", "高さは正の数でなければなりません。"
Else
mHeight = Value
End If
End Property
' 面積を計算して返す(読み取り専用プロパティ)
Public Property Get Area() As Double
' MathJax を使って説明するなら、ここで面積 = 横幅 × 高さ を示す
' \( \text{Area} = \text{Width} \times \text{Height} \)
Area = mWidth * mHeight
End Property
この例では、Width
と Height
を設定する際に入力チェックを行い、さらに Area
プロパティは読み取り専用として計算結果を返しています。クラス利用者は、obj.Area
として面積を取得でき、内部で自動的に計算されます。
まとめ
VBAのクラスモジュールを使うことで、オブジェクト指向の考え方を取り入れたプログラミングが可能になります。Property Get
、Property Let
、Property Set
を使うことで、外部からのアクセス方法を統一し、データの整合性を保ちながら柔軟な機能拡張が行えます。
初心者の方は、まず簡単な例(例えば clsPerson
の例)から試し、プロパティの使い方やエラーチェック、内部処理の実装方法に慣れていくと良いでしょう。クラスモジュールの理解が深まると、より複雑なアプリケーションの開発にも役立ちます。
今回の解説が、VBAにおけるクラスモジュールとゲッター・セッターの理解の一助となれば幸いです。