
photo credit: Aircaft @ Gloucestershire Airport By James N566SR Cirrus SR22 (Private) via photopin (license)
みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載しています。
前回の記事はこちらです。

Property Letプロシージャの使い方をお伝えしました。
なのですが、Property Letプロシージャで作ったプロパティは書き込み専用になっちゃうのですね。
読み取りができないっす…
読み取りをできるようにするにはどうしたらよいでしょうか?
ということで、今回はPropety Getプロシージャを使ってプライベート変数にアクセスする方法です。
では、行ってみましょう!
前回までのおさらい
まず、前回のおさらいです。
以下のようなエクセル表の1行分のデータを表すクラスを作成しております
作成途中のクラスモジュールPersonの内容は以下の通りです。
Private id_ As String Public FirstName As String Public Gender As String Public Birthday As Date Public Sub Greet() MsgBox Me.FirstName & "です、こんにちは!" End Sub Public Property Get IsMale() As Boolean IsMale = (Me.Gender = "male") End Property Public Property Let Id(ByVal newId As String) If id_ <> "" Then Debug.Print "Idは上書きすることはできません" Else id_ = newId End If End Property
エクセル表の列に対応するFirstName、Gender、Birthdayというプロパティを、パブリック変数で、Idというプロパティをプライベート変数とProperty Letプロシージャの組み合わせで作成しています。
それで、検証のための、Subプロシージャは以下の通りで、標準モジュール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 p.Id = "Hoge" Stop 'p.Greet End Sub
やりたいこと:プライベート変数によるプロパティを読み取れるようにする
それで、Idプロパティが初回にデータが書き込まれたのはいいのですが…このままだと読み取れません。
例えば、以下のようなコードを13行目の代わりにしてみましょう。
Debug.Print p.Id
実行してみると…
ダメっすね。
コンパイルエラー: プロパティの使い方が不正です。
となってしまいます。
今回はこれを読み取れるようにしていきたいと思います。
Property Getプロシージャでプライベート変数を読み取る
これの解決法は簡単で、既にシリーズで紹介したProperty Getプロシージャを使います。
プライベート変数id_は、プライベートなので他のモジュールからはアクセスできないのですが、同じモジュールつまりクラスモジュールPerson内のプロシージャからなら読み取ることができます。
そして、プロパティを取得するためのプロシージャはProperty Getプロシージャでしたね。
そのProperty Getプロシージャをパブリックで作成してあげれば、他のモジュールから呼び出せます。
前回お伝えした、Property Letプロシージャと同じように、迂回してアクセスする作戦です。
Property Getプロシージャの構文のおさらい
Property Getプロシージャについては、以下の記事で紹介していますね。

おさらいで、その構文を紹介しておきます。
’処理
プロシージャ名 = 戻り値
End Property
プライベート変数からデータを取得するプロパティ
今回の場合は、プロシージャ名はプロパティ名「Id」とします。
データ型はStringですね。
そして、戻り値は、プライベート変数id_をそのまま返せばOK。
ということで、以下のようなProperty Getプロシージャを作成して、クラスPersonに追加すればよいわけですね。
Public Property Get Id() As String Id = id_ End Property
では、Module1のSubプロシージャを以下のように変更して確認してみましょう。
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 Debug.Print p.Id 'p.Greet End Sub
以下の通り、PersonクラスのインスタンスのIdプロパティを出力することができました。
まとめ
以上、エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法についてお伝えしました。
クラスのデータをプライベート変数にするのであれば、多くの場合でProperty LetプロシージャとProperty Getプロシージャの両方をセットで作成して、そのデータの設定と取得をできるようにします。
ぜひ、覚えておいてくださいね。
次回は、インスタンスの生成時に初期データをセットするメソッドを作ります。

どうぞお楽しみに!
連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう
名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!- 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
- エクセルVBAでクラスに最も簡単なプロパティを追加する方法
- エクセルVBAで自作クラスをインスタンス化する方法
- エクセルVBAでクラスに最も簡単なメソッドを追加する方法
- エクセルVBAで表の1行分のデータを表すクラスを作成する方法
- エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
- エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
- エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
- エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
- エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法