从 VBA Access 中的函数返回数据类型时收到“属性使用无效”错误?

Pan*_*ngu 2 ms-access vba

我创建了一个尝试返回SubForm数据类型的函数。这个功能被各种家长使用Forms

该函数如下所示:

Public Function mySubFrm(name As String, subformName As String) As SubForm

    Dim frm As Form
    Dim subFrm As SubForm

    Set frm = Forms(name)
    Set subFrm = frm.Controls(subformName)

    mySubFrm = subFrm

End Function
Run Code Online (Sandbox Code Playgroud)

我尝试通过以下方式使用它:

Dim testSubForm As SubForm

testSubForm = mySubFrm("testForm", "testSubForm")
Run Code Online (Sandbox Code Playgroud)

立即出现编译错误:

无效使用财产

我试图做的是添加一个手表frm.Controls(subformName),我看到它的返回类型是SubForm/SubForm,所以我觉得我正在声明并设置正确的数据类型,但我又不确定?

有人可以帮助我解决我做得不好的事情吗?

谢谢

Mat*_*don 5

我不太懂Access,但我很了解VBA。

您的函数返回一个对象引用:

Public Function mySubFrm(name As String, subformName As String) As SubForm
Run Code Online (Sandbox Code Playgroud)

因此,必须使用Set关键字指定其返回值:

Set mySubFrm = subFrm
Run Code Online (Sandbox Code Playgroud)

你之所以会遇到这个令人困惑的错误,是因为 VBA 中有一个可爱的(不是!)东西,称为默认属性

看,表单有一个默认属性,很可能是它的Controls集合 - 并且该属性仅公开Public Property Get访问器,这使其成为只读。

所以当你省略Set关键字时:

mySubFrm = subFrm
Run Code Online (Sandbox Code Playgroud)

VBA 假定代码是合法的,因此您可能想要做的唯一一件事就是分配该默认属性 - 换句话说,它的行为与您编写的完全一样:

mySubFrm.Controls = subFrm
Run Code Online (Sandbox Code Playgroud)

但是Controls类自己的默认属性是它的Item成员,它也是只读的:没有办法默认Controls属性不可能出现在赋值的左侧。

因此,财产的无效使用

我的开源项目Rubberduck很快就会进行检查,只要您隐式引用对象的默认属性,并提出显式调用,该检查就会发出结果。当您甚至不知道自己正在引用默认属性时,编写能够说明其作用并执行其说明的代码是很困难的。

  • @盘古,我的荣幸。VBA 编译错误很容易混淆,所有隐含的巫术不断发生。您可以在对象浏览器 (F2) 中找到类型的默认属性 - 它是带有小蓝点的属性(在某些情况下,它是隐藏成员!)。 (3认同)