プロパティはクラスから生成されたオブジェクトの属性を表し、オブジェクトの状態や値を保持しています。 より正確にいえば、プロパティはオブジェクトの状態にアクセスするためのAPIです。 メンバ変数をPublicにしてしまえば、一見プロパティのように扱えますが、プロパティの変化にたいおうして他の状態を変化させたり、プロパティに設定しようとしている値が有効かどうかを事前に判定することができません。 プロパティとはその値の設定に伴った副作用までも制御できる機構です。
プロパティは次のように作成します。
'=[AnimalCls]============================ Private thisName As String '値を書き込む時に呼び出される Public Property Let name(ByVal str As String) thisName = str End Property '値を読み込む時に呼び出される Public Property Get name() As String name = thisName End Property下記のプログラムでは、AnimalClsというクラスからcatというオブジェクトを作成し、nameというプロパティにそのオブジェクトの名前を代入します。
'名前の設定 Dim cat As AnimalCls cat.name = "たま" '名前を読み込む Dim hisName As String hisName = cat.name MsgBox "動物の名前は" & hisName & "です。"
ここでの説明を理解するにはあらかじめプロパティについて理解しておく必要があるので、プロパティがわからない場合は一つ前の節を読んでください。
VBAでは、オブジェクトをクラスのメンバーにしようとするとエラーが出ます。例えば、
[AnimalCls] Dim mike As CatCls [CatCls] Public name As Stringは不可。
この場合は、オブジェクトをクラスのプロパティにすればよい。
[AnimalCls] Private myCat As New CatCls Public Property Set cat(ByVal obj As CatCls) Set myCat = obj End Property Public Property Get cat() As CatCls Set cat = myCat End Property [CatCls] Private thisName As String Public Property Let name(ByVal str As String) thisName = str End Property Public Property Get name() As String name = thisName End Property
C++では、メンバー変数の値を取り出したり、値を設定するためにはメソッドを使う必要があるため cat->getName()とか、cat->setName()のようにせざるを得ないが、VBAでは、プロパティがオブジェクトに付属する変数のように見えるようにできます。
メンバ変数をPublicで定義すれば、直接メンバ変数にアクセスできて且つプロパティのように見せかけることが出来るが、あまり推奨されないらしい。