" & wClct.Item(1) '「wClct(1)" />

VB6・VBA:プロパティ・メソッド省略

Dim wClct As New Collection

wClct.Add 100

'「wClct.Item(1)->100」と表示される
MsgBox "wClct.Item(1)->" & wClct.Item(1)   

'「wClct(1)->100」と表示される
MsgBox "wClct(1)->" & wClct.Item(1)

Set wClct = Nothing

Collectionは、上記のようにItemを省略して記述することができます。
VBで何故このようなことができるか不思議でしたが、
自作のクラスでもできることがわかったのでメモメモ。

以下に簡単な例を作成しました。


Class1.cls
Public Property Get Data() As Long
    Data = 100
End Property

単純にDataプロパティから100という値を取得するだけのクラスです。
このDataプロパティを省略するため、以下の操作を行います。


 

‐蔑設定したい項目のソースをクリック
▲瓮縫紂爾[ツール]-[プロシージャ属性]を選択
[プロシージャ属性]画面の[詳細]ボタンを押下
[プロシージャID]に「(規定値)」を設定


すると以下のようにDataを省略してプロパティ値を取得することができます。


Dim wCls As New Class1

MsgBox "wCls.Data->" & wCls.Data    '「wCls.Data->100」と表示される
MsgBox "wCls->" & wCls              '「wCls->100」と表示される

Set wCls = Nothing

なぜこのようなことができるかというと…
メモ帳等のテキストエディタでクラスファイルを直接開くとわかるかと思いますが、
プロシージャIDを指定したことによりDataプロパティ内に
「Attribute Item.VB_UserMemId = 0」という記述が追加されています。
これによってプロパティの省略ができるようです。


Class1.cls(テキストエディタで開いた場合)
Public Property Get Data() As Long
Attribute Item.VB_UserMemId = 0
    Data = 100
End Property

Attributeはテキストエディタでクラスファイルを開いて直書きすることもできます。
VBに直接記述しても構文エラーになるので注意。


今回の例ではGetプロパティのみでしたが、
LetやSet、Sub、Functionのどれでも省略は可能なようです。
もちろん引数があっても問題ありません。

ちなみにプロパティの場合は
Get・Let・Setのどれかに指定すればどれでも省略可能になるようです。

ただし、当たり前ですが、複数箇所に指定しても正しく動作しません。




ところで、ExcelVBA等でこれを設定しようとしても、
「プロシージャ属性」に当たるメニューがない(多分;)ために設定することができません。

しかし、少し手間をかければ設定できなくもありません…。
一旦作成したクラスをエクスポートして、省略させたいプロパティ等に
直接テキストエディタでクラスファイルを開き「Attribute Item.VB_UserMemId = 0」を記述します。
その後に、クラスをインポートし直すと、省略させることができます。

VB6で作成したクラスをインポートするのもOKのようです。



コメント
コメントする








    
この記事のトラックバックURL
トラックバック