みなさん、こんにちは!
タカハシ(@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でクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
- エクセルVBAでインスタンスの集合をコレクション化する方法
- エクセルVBAでコレクション化したインスタンスを取り出す方法
- エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
- エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
- エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
- エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
- エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
- エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
- エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット