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

时间:2016-05-02 13:06:21

标签: forms vba ms-access access-vba eval

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

由于预留了按钮,我想锁定/解锁控​​制修改。 为了更加通用,我希望事件调用的子函数调用自制函数:

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也是一个自制函数,返回调用函数的模块的正确名称)

例如,这个名称如下所示:

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

和"代码"变量,它设置" Forms!Module1.Controls!Name.Locked = True" (模块1由getModuleName生成,Name为参数(我还没有找到更好))

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

我的问题是Eval()行发生错误并说:

  

错误代码:2770。您在Visual Basic过程中作为OLE对象提到的对象不是OLE对象

我已经浏览了StockOverflow和其他论坛,找出了Eval()的错误,我发现这个功能的行为不符合我的要求。所以我试图找到另一种方法来做到这一点,因为Evaluate函数在Access等中并不存在,但我发现没有什么真正有用的。

我尝试在DoCmd的参数字符串上使用CallEval()或各种转换,但到目前为止还没有任何工作......

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

1 个答案:

答案 0 :(得分:1)

您可以在不使用Eval() ...

的情况下轻松完成所需操作
Sub LockAssociateControl(fctName As String, pVal As Boolean)
    Forms(getModuleName).Controls(fctName).Locked = pVal
End Sub

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