- 締切済み
VBAのインスタンス変数識別子
お世話になります。 ExcelVBAで次のようなクラスモジュールがあるとします。 Private lngX As Long Public Property Let setX(ByVal lngX As Long) Debug.Print lngX End Property ここで、3行目のlongXはローカル変数としてのlngXが参照されていますよね。このプロシージャの中で、ローカル変数と同名のインスタンス変数を参照するにはどのようにすればよいのでしょうか。 Javaでは this.lngX、VB.NETでは Me.lngX とすればよいと思うのですが、VBAにはこのような識別子は用意されていないのでしょうか。当方の環境はExcelVBAですが、VB6でもおなじだと思いますのでそちらではどうなっているかでもかまいません。 宜しくお願い致します。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。#4 です。 >lngX = myX >でも用は足りるのですが、もしも >Me.lngX = lngX >というコードが許されるのであれば、 >その方が(少なくとも私にとっては)可読性が高くなりますので、そのようなコードにしようかな、と。 釈迦に説法かもしれませんが、それは、外部から内容を読めないように隠してあるのですね。 わざわざ、 Private lngX As Long としている所以です。そうでなければ、Public にします。しかし、こういうのって、VBAに関してのみに限定すると、私は使ってはいますが、何か形だけの話のような気がします。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 たとえば、VB6/VBA とVB.Net では、Class の扱い方がまったく違いますから、Me.lngX などという使い方は皆無に近いというよりも、出来るけれども、意味がありません。 VBAでは、通常、以下のような書き方をします。ただし、クラスモジュール内変数-lngX は、Private にするのが正しい使い方です。ただ、VBAで、具体的にどのような仕事をさせるか分かると、また別の方向に話がいくと思いますが、VBAでは、こうした使い方は、めったに出てきません。 ------------------------------------------ 'Class1 モジュール Private lngX As Long Public Property Let X(ByVal myX As Long) lngX = myX Debug.Print lngX End Property ------------------------------------------ '標準モジュール Dim myClass As Class1 Sub Test1() Set myClass = New Class1 myClass.X = 10 End Sub
- nidoking
- ベストアンサー率69% (18/26)
色々やってみたら、 lngXのClass内での宣言を、publicとすると、 Property内からMe.lngXでインスタンス変数を参照できました。 この場合、Moduleからも、obj.lngXで参照可能となってしまいますが・・・ 仕様なんでしょうが、Meの参照範囲のバグっぽいですね
- nidoking
- ベストアンサー率69% (18/26)
module名.lngX と指定すると、moduleスコープの変数にアクセスできます。
補足
ありがとうございます。 標準モジュールではたしかにうまく行きました。しかしクラスモジュールではモジュール名を指定しても「変数が定義されていません」と表示されてコンパイルが通りません。VB6だと違った結果になるのでしょうか。
- dsuekichi
- ベストアンサー率64% (171/265)
多分できないと思いますよ。 ExcelVBAやVB6での「Private」の扱いが、VB.NETとかとは違いますから・・・ VB.NETとかでは、同一クラスなら、別のインスタンスのPrivate属性の変数を参照可能ですよね? しかし、VBAやVB6では、クラスが同一かどうかに関らず別のインスタンスのPrivate属性の変数は参照できません。 #Private属性は、「自分自身のインスタンスからしか参照できない」と言う制限になっています。 その制限を実現するために、「インスタンスを指定してPrivate変数を参照する」事自体できなくなってしまっています。 別の名前にするしかないと思います。
補足
どうもありがとうございます。 > 具体的にどのような仕事をさせるか分かると、また別の方向に話がいくと思いますが、 JavaBeanのようなデータモデルを表すクラスのセッタ、ゲッタ内での利用を想定しています。 引用していらっしゃるクラスモジュールのように、これまでインスタンス変数とローカル変数のプレフィックスを変えることで対応してきましたが、ひょっとしたらVBAにも識別子があるのでは・・・と思って質問致しました。 lngX = myX でも用は足りるのですが、もしも Me.lngX = lngX というコードが許されるのであれば、その方が(少なくとも私にとっては)可読性が高くなりますので、そのようなコードにしようかな、と。