MS Access VB布尔函数失效:表单打开拦截逻辑异常排查
布尔函数失效的原因分析
你的frmChck函数失效主要有三个关键问题:
1. SQL条件字符串未加单引号
FormName是文本类型字段,在DLookup的查询条件中,文本值必须用单引号包裹。原代码中:
If Not IsNull(DLookup("RFid", "qryRestriction", "FormName =" & frmName)) Then
拼接后会生成类似FormName = Form1的条件,SQL会把Form1识别为字段名而非字符串值,导致查询无结果,最终frmChck无法被设为True。
而直接写的代码里加了单引号:
FormName = '" & Me.Name & "'
生成的条件是FormName = 'Form1',符合文本字段的查询语法,能正确匹配数据。
2. frmName函数在OnOpen事件中无法获取正确表单名称
表单的OnOpen事件触发时,表单还未完成加载,并未成为激活状态,此时Screen.ActiveForm可能指向其他已打开的表单,甚至返回空值,导致frmName函数返回错误的名称(或报错),进而让DLookup的条件完全错误。
而直接使用Me.Name是在表单自身的事件中,Me直接指向当前要打开的表单,能准确获取表单名称。
3. 布尔函数未明确处理默认返回值
虽然VBA中布尔函数默认返回False,但你的frmChck函数仅在条件满足时赋值为True,如果前面的查询出错或无结果,函数会保持默认的False——不过这是次要问题,核心还是前两点。
修复建议
修改函数,解决上述问题:
Function frmChck(formName As String) As Boolean ' 传入当前表单名称,避免依赖Screen.ActiveForm If Not IsNull(DLookup("RFid", "qryRestriction", "FormName = '" & formName & "'")) Then frmChck = True Else frmChck = False End If End Function
然后在表单OnOpen事件中调用:
If frmChck(Me.Name) = True Then Cancel = True End If
内容的提问来源于stack exchange,提问作者Makoi Fernandez
相关产品推荐
相关产品推荐

