
photo credit: Don Burkett Little Brody-4404 via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載を進めております。
前回の記事はこちらです。

エクセル表の1行分のデータをクラス化する方法をお伝えしました。
さて、皆さんは「Propertyプロシージャ」というキーワードは聞いたことありますか?
VBAでは、Subプロシージャ、Functionプロシージャに加えて、そのPropertyプロシージャでも「手続き」を作ることができるのですが…あまり見かけないですよね?
知りたいですよね!?
ということで、今回はエクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法をお伝えします。
では、行ってみましょう!
前回までのおさらい
前回までで以下のエクセル表の1行分のデータを表すクラスを作成しました。
クラスモジュール「Person」には以下のようなコードを書きました。
Public Id As String Public FirstName As String Public Gender As String Public Birthday As Date Public Sub Greet() MsgBox Me.FirstName & "です、こんにちは!" End Sub
エクセル表の見出しに対応する4つのプロパティと、Greetメソッドを定義しています。
また、標準モジュール「Module1」には、確認用のSubプロシージャとして以下のコードを書きました。
Sub MySub() Dim p As Person Set p = New Person With Sheet1 p.Id = .Cells(2, 1).Value p.FirstName = .Cells(2, 2).Value p.Gender = .Cells(2, 3).Value p.Birthday = .Cells(2, 4).Value End With Stop 'p.Greet End Sub
この例では、2行目のBobさんのデータについてインスタンスを生成して、Personオブジェクト化をしたわけですね。
男性かどうかを判定するプロパティ
クラスPersonには、すでに4つのプロパティを定義しているわけですが、これにもう1つプロパティを追加したいと思います。
どういうものかというと、そのPersonオブジェクトが男性かどうかを判定する「IsMaleプロパティ」です。
男性であればTrueを、女性であればFalseを返す、ブール型のプロパティを考えています。
モジュール変数を追加する場合
プロパティは、クラスモジュールにモジュール変数を宣言することで追加できますので、クラスモジュールPersonの宣言セクションに、以下の一文を追加するという方法が考えられます。
Public IsMale As Boolean
この場合、標準モジュールModule1のほうは、以下のようなコードにすればいいでしょうか(ついでに、検証しやすいように、行番号を変数iに持たせるようにしました)。
Sub MySub() Dim p As Person: Set p = New Person Dim i As Long: i = 2 With Sheet1 p.Id = .Cells(i, 1).Value p.FirstName = .Cells(i, 2).Value p.Gender = .Cells(i, 3).Value p.Birthday = .Cells(i, 4).Value p.IsMale = (p.Gender = "male") End With Stop 'p.Greet End Sub
しかし、これでは性別を表すGenderプロパティがこの後の処理で変更になった場合(現実的にあるかどうかは別としてw)、IsMaleプロパティも設定し直すのを忘れないようにしないといけません。
IsMaleプロパティを参照しようとしたときに、都度Genderプロパティの値から判定して値を返すようにできればいいのですが…
と、そのようなことを実現するのが、Property Getプロシージャということになります。
Property Getプロシージャとは
Property Getプロシージャは、プロシージャですから「手続き」を定義することができます。
どんな手続を定義するかというと、「プロパティを取得する際の手続き」を定義します。
つまり、何らかの手続を経てプロパティを取得することができます。
書き方はこうです。
’処理
プロシージャ名 = 戻り値
End Property
なんとなくFucntionプロシージャに似ていますね?
戻り値を返す仲間なので、Property GetプロシージャとFunctionプロシージャの定義の仕方は似ています。
Property Getプロシージャでプロパティを定義する
では、Property Getプロシージャを用いて、男性かどうかを判定するIsMaleプロパティを作成してみましょう。
クラスモジュールPersonに、以下のProperty Getプロシージャを追加しましょう。
Public Property Get IsMale() As Boolean IsMale = (Me.Gender = "male") End Property
これでOK。
先ほど、Module1に追加しようとしていたGenderプロパティの判定処理を、クラスモジュールのProperty Getプロシージャに書いたという感じですかね。
では、例のごとく、F2 キーでオブジェクトブラウザーを開いて確認してみましょう。
クラスPersonにIsMaleプロパティが追加されていることが確認できます。
しかも、下部の「詳細ペイン」を見ると、以下のように記載されています。
Public Property IsMale As Boolean
読み取り専用
ここを見ると、プロパティがモジュール変数で宣言されたものなのか、Property Getプロシージャで定義されたものなのかがわかりますね。
しかも、Property Getプロシージャのみで作成したプロパティは「読み取り専用」になるわけですね。書き込みされても困りますもんね。
Property Getプロシージャによるプロパティの動作を確認
では、Property Getプロシージャで作成したIsMaleプロパティの動作を確認してみましょう。
標準モジュールModule1を以下のように検証できるように変更しました。
Sub MySub() Dim p As Person: Set p = New Person Dim i As Long: i = 2 With Sheet1 p.Id = .Cells(i, 1).Value p.FirstName = .Cells(i, 2).Value p.Gender = .Cells(i, 3).Value p.Birthday = .Cells(i, 4).Value End With Stop p.Gender = "female" Stop 'p.Greet End Sub
実行して1回目のStopステートメントの中断時にローカルウィンドウを確認すると
- Genderプロパティ: “male”
- IsMaleプロパティ: True
となっています。
- Genderプロパティ: “female”
- IsMaleプロパティ: False
Genderプロパティの値に連動して、IsMaleプロパティの値も変更されていますね。
Bobさんには悪い気がしますが…
まとめ
以上、エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法をお伝えしました。
Property Getプロシージャを使うと、何らかの手続きによってプロパティを取得することができます。
このように、クラスモジュールにプロシージャを追加していくことで、クラスに対する操作を追加したり、データを計算・加工して取り出したり、といった機能を追加することができます。
このエクセル表のデータに関する手続きはクラスモジュールがバッチリ担当してくれているとなれば、コードの管理…めっちゃわかりやすくなりますよね。
さて、次回は「別のPropertyプロシージャ」を紹介したいと思います。
どうぞお楽しみに!