4

Excel の VBA には、オブジェクト修飾子なしで使用できるプロパティがいくつかあります。たとえば、オブジェクト修飾子なしでプロパティ ActiveCell を使用すると、Application オブジェクトで使用したかのようになります。一般に、オブジェクト修飾子を指定しない場合、プロパティが呼び出されるオブジェクトはどのように決定されるのでしょうか? たとえば、自分のクラスで同様のことを行うことはできますか? オブジェクト修飾子なしで呼び出すことができるプロパティを自分のクラスで宣言できますか?

4

1 に答える 1

2

ApplicationVBA では、モジュールまたはクラスは、次にそれがアタッチされているオブジェクト ( userformworksheet、またはThisWorkbook)、それ自体から継承されると見なされます。また、プロシージャ名が明確な場合は、通常、使用時に修飾する必要はありません。

クラスまたはモジュールにメソッドも含まれていない限り、Application.ActiveCell単に として参照できます。その場合は、 で修飾する必要があります。ActiveCellActiveCellApplication.

これはまたMyProc、 のメンバーとしてを持っている場合、別のコード/モジュール ファイルから単にとしてMyModule参照できることを意味します。そうしないと、あいまいであるというエラーが発生します。つまり、またはに修飾する必要があります。MyProcMyProcMyOtherModuleMyProcMyModule.MyProcMyModuleMyOtherModule.MyProcMyOtherModuleMyModule.MyProcMyOtherModule.MyProc

でも...

クラス モジュールは、クラスの内部動作を定義します。クラスは、 で使用する前にインスタンス化する必要がありますNew。クラスのプロパティは、クラスの特定のインスタンスを参照するため、参照先のインスタンスで常に修飾する必要があります。MyClassつまり、文字列プロパティを持つクラスがある場合、インスタンスを介しMyPropertyて呼び出す必要があります。MyProperty

Set MyClassInstance = New MyClass
Debug.Print MyClassInstance.MyProperty()

あるいは:

Debug.Print (New MyClass).MyProperty()

Withクラス インスタンスの名前を入力しないようにする唯一の方法は、ブロックを宣言することです。

Set MyClassInstance = New MyClass
With MyClassInstance 
    Debug.Print .MyProperty()
End With
于 2013-09-13T05:06:28.627 に答える