我在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
的参数字符串上使用Call
或Eval()
或各种转换,但到目前为止还没有任何工作......
所以,我的问题是:你们中的任何人都有解决这个问题的方法吗?如果没有,您是否知道不必在每个事件函数中写入完整语句,例如:Forms!Module1.Controls!Name.Locked = False
?
答案 0 :(得分:1)
您可以在不使用Eval()
...
Sub LockAssociateControl(fctName As String, pVal As Boolean)
Forms(getModuleName).Controls(fctName).Locked = pVal
End Sub
注意我将参数名称从val
更改为pVal
,以避免将其与Val()
函数混淆。