Enumの研究(3)
Enumの研究(3)
こいつら
の続き。
今回はちょっと手の込んだことをする。
組み込みプロパティ名と衝突した場合のち~んw珍現象
まず、Sheet1に次のような表を作成しておく。
次に、Sheet1
モジュールに次のコードを書く。
リスト1 Sheet1モジュール
Public Property Get HogeValue(ByVal index As Hoge) As String If index = Name Then HogeValue = "Hoge": Exit Property HogeValue = Me.Range("A1").CurrentRegion.Item(index) End Property
そして、Enum「Hoge
」は次のようにしておく。
リスト2 標準モジュール宣言セクション
Public Enum Hoge Name = 0 hgFirstElement = 2 hgSecondElement hgThirdElement hgFourthElement hgFifthElement End Enum
実は、リスト2の入力中、
If index =
まで入力すると、
このように、クイックヒントが出る。プロパティ「HogeValue
」の引数がHoge
型なのだから、当り前なのだが、とにかく、VBEの指示通りに入力すると、この行は
If index = Name Then HogeValue = "Hoge": Exit Property
となるのである。
使ってみる
さっそく、Sheet1
オブジェクトのHogeValue
プロパティを利用するコードを書いて実行してみる。
リスト3 標準モジュール
Public Sub test03() Debug.Print Sheet1.HogeValue(Name) End Sub
こいつをステップ実行してみる。
引数Name
のところにマウスを当てると、「0
」がポップアップする。
この時点では、「Name
」は「0
」と解釈されている。
この行を実行すると、処理がSheet1
のProperty Get HogeValue
プロシージャに移る。
「index
」のところにマウスを当てると、「「0
」がポップアップするので、引数「index
」はちゃんと「0
」を受け取っている。当たり前だが。
さらに1行処理を進める。すると、
あっ。ここで「Name
」にマウスを当てると、「Sheet1
」がポップアップする。
すなわち、Sheet1
モジュール内では「Name
」はEnum「Hoge
」のメンバではなく、Sheet1
オブジェクトのメンバと評価されてしまうようだ。
当然、そのまま実行すると、
こうなる。
おわりに
リスト1の
If index = Name Then HogeValue = "Hoge": Exit Property
を、
If index = Hoge.Name Then HogeValue = "Hoge": Exit Property
とすれば意図どおりに動作する。