用于设置表单控件的 Eval() 属性

Eval() for setting Form controls property

我在 Access VBA 2013 应用程序上工作,项目的这一部分侧重于表单控件和按钮。

我想 lock/unlock 控制修改,这要归功于预留的按钮。 为了更通用,我希望事件调用的 subs 调用自制函数:

Sub LockAssociateControl(fctName As String, val As Boolean)
    Dim code As String
    code = "Forms!" & getModuleName & ".Controls!" & fctName & ".Locked = " & CStr(val)
    Debug.Print (code) 'just to test
    Eval code
End Sub

(getModuleName也是一个自制函数,returns调用该函数的模块的正确名称)

例如这个叫法如下:

Private Sub FirstName_Exit(Cancel As Integer)
    Call LockAssociateControl("FirstName", True)
End Sub

在"code"变量中,设置"Forms!Module1.Controls!Name.Locked = True"(以getModuleName生成的Module1,Name为参数(我还没找到更好的)).

现在我想要评估此代码以避免我对每个事件子代码进行硬编码。

我的问题是在 Eval() 行发生错误并显示:

Error Code: 2770. The object to which you reffered in the Visual Basic procedure as an OLE object is not an OLE object

我查看了 StockOverflow 和其他论坛以找出 Eval() 的问题,我发现此函数的行为不是我想要的。所以我试图找到另一种方法来做到这一点,因为 Evaluate 函数在 Access 等中不存在,但我发现没有什么真正有用的。

我尝试使用 DoCmdCall 或对 Eval() 的参数字符串进行各种转换,但到目前为止没有任何效果...

所以这是我的问题:你们中有人有解决这个问题的方法吗?如果没有,您是否知道不必在每个事件函数中都编写完整语句的替代方法,例如:Forms!Module1.Controls!Name.Locked = False?

无需使用 Eval() ...

,您可以更轻松地完成您想做的事情
Sub LockAssociateControl(fctName As String, pVal As Boolean)
    Forms(getModuleName).Controls(fctName).Locked = pVal
End Sub

请注意,我将参数名称从 val 更改为 pVal 以避免将其与 Val() 函数混淆。