3

したがって、オブジェクトのプライベート変数の 1 つが配列であり、次のように宣言された o_exception があります。

Private o_exception() as string

値を初期化するときに完全にテストできます。下限、上限、値、すべて問題ありません。

次に、オブジェクトの外部から配列の値にアクセスできるように let プロパティを定義しようとしています。

Property Get exception()
On Error GoTo ERREUR
exception = o_exception
On Error GoTo 0
End Property

私はまだ自分のプロパティを配列として完全に識別することができます:

lbound(myObject.exception) is available
ubound(myObject.exception) is available
isArray(myObject.exception) returns a yes

しかし

myObject.exception(0) 

次のエラーが表示されます。

run-time error 451: Property let procedure not defined and property get procedure did not return an object

私はそれを必要としないので、let を持っていません。他のオブジェクトで非常に同じ構造で実行されている非常によく似たコードがあります。私の唯一の手がかりは、 myObject が別のオブジェクト (コレクション) のメンバーとして定義されているため、次のように入力してアクセスする必要があるということです。

myCollection.myObject.exception(0)

ちなみに、プロパティ Get をパブリック関数に置き換えると、まったく同じエラーが発生します...

4

1 に答える 1

3

いくつかのコメント:

  • あなたが提供した情報で問題を再現することはできません. によって返された配列にアクセスする必要がありますProperty Get.
    ただし、エラーメッセージは、インタープリターがコードを割り当てと見なしていることを示唆しているため、コンテキストが重要である可能性があり、質問に欠けているものがあるはずです.

  • 配列は割り当て時にコピーされるため、希望どおりに動作しない可能性があります。そのため、プロパティを参照するたびmyObject.exceptionに、内部o_exception配列のコピーが返されます。
    配列の内容を変更しようとして、実際にはまったく変更されないことに気付くと、実際にそれを見ることができます。

'---------------------------------
' Class1 code '
'---------------------------------
Private o_exception() As String

Property Get exception()
    exception = o_exception
End Property

Private Sub class_initialize()
    ReDim Preserve o_exception(10)
    o_exception(0) = "qwerty"
    o_exception(1) = "azerty"
End Sub    

'---------------------------------
' Test module '
'---------------------------------
Public Sub test()
    Dim a As Class1
    Set a = New Class1

    Debug.Print TypeName(a.exception)

    Debug.Print LBound(a.exception)
    Debug.Print UBound(a.exception)
    Debug.Print IsArray(a.exception)

    Debug.Print a.exception(0)
    a.exception(0) = "asdfg"
    Debug.Print a.exception(0)

    Dim s() As String
    s = a.exception()

    ' Print the memory address of the first string in each array '
    ' We could expect it to be the same, but they are not '
    Debug.Print StrPtr(s(0))
    Debug.Print StrPtr(a.exception(0))

    ' just to prove the point '
    s(0) = "ZZZZZZZZ"
    Debug.Print s(0)
    Debug.Print a.exception(0)

End Sub

呼び出すtestと、次のように出力されます。

Class1
String()
0
10
True
qwerty
qwerty    => Should be 123456!
296094084 
296093004 => Expected to be the same address  as above, it's not!
ZZZZZZZZ
qwerty    => Should be ZZZZZZZZ!

Collectionこの問題を解決するには、次のように、配列自体を公開する代わりに、クラスを使用または構築して個々のオブジェクトを返すことができます。

' Just use myObject.exception(0) as one would expect '
Property Get exception(index As Long) As String
    exception = o_exception(index)
End Property

ついでに言うと、あなたのコードはエラー管理を扱っているように見えるので、vbWatchdogを確認することを心からお勧めします。Access のエラーをグローバルな方法で管理するには、本当に本当に素晴らしいです (その製品とは関係ありませんが、満足しているユーザーです)。

于 2012-11-21T03:13:21.043 に答える