都道府県穴埋めゲーム

お世話になります。
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でもおなじだと思いますのでそちらではどうなっているかでもかまいません。

宜しくお願い致します。

A 回答 (5件)

こんにちは。

#4 です。

>lngX = myX
>でも用は足りるのですが、もしも
>Me.lngX = lngX
>というコードが許されるのであれば、

>その方が(少なくとも私にとっては)可読性が高くなりますので、そのようなコードにしようかな、と。

釈迦に説法かもしれませんが、それは、外部から内容を読めないように隠してあるのですね。

わざわざ、
Private lngX As Long

としている所以です。そうでなければ、Public にします。しかし、こういうのって、VBAに関してのみに限定すると、私は使ってはいますが、何か形だけの話のような気がします。
    • good
    • 0

こんばんは。



たとえば、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

この回答への補足

どうもありがとうございます。

> 具体的にどのような仕事をさせるか分かると、また別の方向に話がいくと思いますが、

JavaBeanのようなデータモデルを表すクラスのセッタ、ゲッタ内での利用を想定しています。

引用していらっしゃるクラスモジュールのように、これまでインスタンス変数とローカル変数のプレフィックスを変えることで対応してきましたが、ひょっとしたらVBAにも識別子があるのでは・・・と思って質問致しました。

lngX = myX
でも用は足りるのですが、もしも
Me.lngX = lngX
というコードが許されるのであれば、その方が(少なくとも私にとっては)可読性が高くなりますので、そのようなコードにしようかな、と。

補足日時:2007/04/25 10:05
    • good
    • 0

色々やってみたら、


lngXのClass内での宣言を、publicとすると、
Property内からMe.lngXでインスタンス変数を参照できました。
この場合、Moduleからも、obj.lngXで参照可能となってしまいますが・・・

仕様なんでしょうが、Meの参照範囲のバグっぽいですね
    • good
    • 0

module名.lngX と指定すると、moduleスコープの変数にアクセスできます。

この回答への補足

ありがとうございます。

標準モジュールではたしかにうまく行きました。しかしクラスモジュールではモジュール名を指定しても「変数が定義されていません」と表示されてコンパイルが通りません。VB6だと違った結果になるのでしょうか。

補足日時:2007/04/23 12:49
    • good
    • 0

多分できないと思いますよ。



ExcelVBAやVB6での「Private」の扱いが、VB.NETとかとは違いますから・・・

VB.NETとかでは、同一クラスなら、別のインスタンスのPrivate属性の変数を参照可能ですよね?
しかし、VBAやVB6では、クラスが同一かどうかに関らず別のインスタンスのPrivate属性の変数は参照できません。
#Private属性は、「自分自身のインスタンスからしか参照できない」と言う制限になっています。

その制限を実現するために、「インスタンスを指定してPrivate変数を参照する」事自体できなくなってしまっています。

別の名前にするしかないと思います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!