1

カスタムCOMクラスのメンバーを持つクラスモジュールMyVBAclassがあります

Private mMyCOMclass As MyCOMclass
Public Property Get InnerClass() As MyCOMclass
    Set InnerClass = mMyCOMclass
End Property
Public Property Let InnerClass(value As MyCOMclass)
    Set mMyCOMclass = value
End Property
Private Sub Class_Initialize()
    Set mMyCOMclass = New MyCOMclass
End Sub

MyCOMclassにはClone()メソッドとCopyTo()メソッドが実装されており、CloneはMyCOMclassの新しいインスタンスを返し、CopyToはプロパティを既に初期化されたオブジェクトにコピーするだけです。これは私が抱えている問題であり、誰かがそれを回避する方法を説明できれば素晴らしいと思います。

Dim MyVBAinstance As MyVBAclass
Set MyVBAinstance = New MyVBAclass

Dim COMinstance As MyCOMclass, copyOfCOM As MyCOMclass
Set COMinstance = New MyCOMclass
Set copyOfCOM = New MyCOMclass

' Do some stuff with COMinstance

Call COMinstance.CopyTo(copyOfCOM) ' Works fine
MyVBAinstance.InnerClass = COMinstance.Clone() ' Works fine even without Set

Call COMinstance.CopyTo(MyVBAinstance.InnerClass) ' DOESN'T WORK
4

1 に答える 1

2

オブジェクト指向の考え方は、オブジェクトがそのメンバーを外界から隠すことです。GETおよびプロパティはSET「ゲートウェイ」として機能します。これは、下にあるオブジェクトの変更を単純にオーバーライドできるルーチンはありませんMyVBAinstance.InnerClass。あなたがする必要があるのは:

Dim objTemp as As MyCOMclass
Set objTemp = New MyCOMclass 'this will reserve the memory and store the pointer in objTemp
Call COMinstance.CopyTo(objTemp) 'this will fill the allocated memory
Set MyVBAinstance.InnerClass = objTemp 'this will copy the pointer from objTemp to MyVBAinstance.InnerClass

クラスのプライベートメンバーを公開したい場合は、実行しているときにPROPERTY GETおよびPROPERTY SET/PROPERTY LETメソッドを提供する必要があります。GETプロパティにアクセスするたびに呼び出されます。また、オブジェクト/値をプロパティに割り当てるとPROPERTY SET/が呼び出されます。PROPERTY LET

プロパティがオブジェクトの場合は、を使用する必要があります。PROPERTY SETネイティブタイプ(整数、文字列など)の場合は、を使用する必要がありますPROPERTY LET

SET同様に、 (eg )を使用してオブジェクトをプロパティに割り当てる必要がありますが、 ( eg'MyVBAInstance.Name = "Test"`)を使用Set MyVBAInstance.InnerClass = anotherObjectしないネイティブタイプを割り当てる必要があります。SET

したがって、コードで次のように置き換えLETますSET

Public Property Set InnerClass(value As MyCOMclass)
    Set mMyCOMclass = value
End Property

次にSET、コードでキーワードを使用します。

Set MyVBAinstance.InnerClass = COMinstance.Clone()

于 2013-02-18T10:07:05.380 に答える