エクセルVBAでProperty Getプロシージャを使ってプライベート変数にアクセスする方法


private

photo credit: Aircaft @ Gloucestershire Airport By James N566SR Cirrus SR22 (Private) via photopin (license)

みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。

「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ連載しています。

前回の記事はこちらです。

エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
「初心者でもわかるエクセルVBAのクラスモジュール」について連載でお送りしております。今回はエクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法をお伝えします。

Property Letプロシージャの使い方をお伝えしました。

なのですが、Property Letプロシージャで作ったプロパティは書き込み専用になっちゃうのですね。

読み取りができないっす…

読み取りをできるようにするにはどうしたらよいでしょうか?

ということで、今回はPropety Getプロシージャを使ってプライベート変数にアクセスする方法です。

では、行ってみましょう!

スポンサーリンク

前回までのおさらい

まず、前回のおさらいです。

以下のようなエクセル表の1行分のデータを表すクラスを作成しております

エクセルVBAでクラス化するエクセル表

作成途中のクラスモジュール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

実行してみると…

エクセルVBAでプライベート変数のプロパティにアクセスしたときのコンパイルエラー

ダメっすね。

コンパイルエラー: プロパティの使い方が不正です。

となってしまいます。

今回はこれを読み取れるようにしていきたいと思います。

Property Getプロシージャでプライベート変数を読み取る

これの解決法は簡単で、既にシリーズで紹介したProperty Getプロシージャを使います。

プライベート変数id_は、プライベートなので他のモジュールからはアクセスできないのですが、同じモジュールつまりクラスモジュールPerson内のプロシージャからなら読み取ることができます。

そして、プロパティを取得するためのプロシージャはProperty Getプロシージャでしたね。

そのProperty Getプロシージャをパブリックで作成してあげれば、他のモジュールから呼び出せます。

前回お伝えした、Property Letプロシージャと同じように、迂回してアクセスする作戦です。

Property Getプロシージャの構文のおさらい

Property Getプロシージャについては、以下の記事で紹介していますね。

エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
「初心者でもわかるエクセルVBAのクラスモジュール」をテーマにシリーズ進めております。今回はエクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法をお伝えします。

おさらいで、その構文を紹介しておきます。

Property Get プロシージャ名() As
 ’処理
 プロシージャ名 = 戻り値
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でProperty Getプロシージャでプロパティの値を出力

まとめ

以上、エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法についてお伝えしました。

クラスのデータをプライベート変数にするのであれば、多くの場合でProperty LetプロシージャとProperty Getプロシージャの両方をセットで作成して、そのデータの設定と取得をできるようにします

ぜひ、覚えておいてくださいね。

次回は、インスタンスの生成時に初期データをセットするメソッドを作ります。

エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
「初心者でもわかるエクセルVBAのクラスモジュール」についてシリーズでお伝えしています。今回は、エクセルVBAでクラスのインスタンス生成時にデータを簡単に格納する、つまりコンストラクタ的なメソッドを作る方法です。

どうぞお楽しみに!

連載目次:初心者でもわかる!エクセルVBAでクラスを作ろう

名前は聞いたことあるけどよくわからない「クラスモジュール」。本シリーズでは、初心者でも少しずつ丁寧にその作り方と便利さについてお伝えしていきますよ!
  1. 【初心者でもできる】エクセルVBAで最も簡単なクラスを作る方法
  2. エクセルVBAでクラスに最も簡単なプロパティを追加する方法
  3. エクセルVBAで自作クラスをインスタンス化する方法
  4. エクセルVBAでクラスに最も簡単なメソッドを追加する方法
  5. エクセルVBAで表の1行分のデータを表すクラスを作成する方法
  6. エクセルVBAでProperty Getプロシージャを使って簡単なプロパティを作成する方法
  7. エクセルVBAでプロパティを他のモジュールからアクセスできないようにする方法
  8. エクセルVBAでProperty Letプロシージャを使ってプロパティ設定をする方法
  9. エクセルVBAでPropety Getプロシージャを使ってプライベート変数にアクセスする方法
  10. エクセルVBAでクラスのインスタンス生成時に初期データを格納するメソッドを作る方法
  11. エクセルVBAでインスタンスの集合をコレクション化する方法
  12. エクセルVBAでコレクション化したインスタンスを取り出す方法
  13. エクセルVBAでクラスモジュールを使って独自のコレクションを作る方法
  14. エクセルVBAでインスタンス生成時に自動で処理を実行するイベントプロシージャClass_Initialize
  15. エクセルVBAで自作コレクションのインスタンス生成時に初期データも投入する方法
  16. エクセルVBAで自作コレクションの要素を取得するプロパティの作り方
  17. エクセルVBAで自作のコレクションに要素を追加するメソッドを作成する
  18. エクセルVBAで自作コレクションの要素を削除するメソッドの作り方
  19. エクセルVBAでエクセル表のデータを反映するメソッドとクラスを使うメリット

タイトルとURLをコピーしました