VBA for Access,运行时错误451:属性let过程未定义,属性get过程未返回对象

时间:2012-11-20 16:42:04

标签: vba ms-access

所以我有一个我的对象的私有变量,它是一个数组: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)

顺便说一句,用公共函数替换Property Get会产生同样的错误......

1 个答案:

答案 0 :(得分:3)

几句话:

  • 无法使用您提供的信息复制您的问题,访问Property Get返回的数组应该可以正常工作(以下代码可以正常工作)。
    但是,错误消息表明解释器正在考虑将您的代码作为一项任务,因此上下文可能很重要,您的问题中必定存在某些内容。

  • 由于they are copied on assignment,数组的行为可能不符合您的要求,因此每次引用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中的错误(与该产品无关,只是一个快乐的用户)真的非常非常棒。