专为易于使用而设计的 Microsoft 关系数据库管理系统系列。
注:此回复已自动翻译。因此,它可能包含语法错误或表达尴尬。
你好 何尧
感谢你在 Q&A 论坛提交问题。我非常感谢你花时间描述你的需求。 根据你的说明,我理解到你希望创建一个总逻辑函数(函数 A),并且在这个函数执行结束后,它的 Boolean 结果能够“传递”给表单的 BeforeUpdate 事件中的 Cancel 参数。如果我的理解有误,请随时告诉我。 下面是两种可行的处理方式:
方法一:快速方案。
在标准模块中放置以下函数:
Public Function MyValidator() As Boolean
Dim isValid As Boolean
' 示例验证逻辑(你可以自行替换)
isValid = (Screen.ActiveControl.Value <> "错误值")
If Not isValid Then
MsgBox "数据无效!", vbExclamation
' 等效于 Cancel = True,用于取消 BeforeUpdate
DoCmd.CancelEvent
End If
MyValidator = isValid
End Function
然后在控件或表单的 Before Update 属性中填写:=MyValidator()
方法二:使用类模块,可以直接控制 Cancel 参数。
创建类模块(名称:clsInputShield):
Public WithEvents TargetControl As Access.TextBox
Private Sub TargetControl_BeforeUpdate(Cancel As Integer)
If TargetControl.Tag = "CheckMe" Then
If Not YourGlobalLogic(TargetControl.Value) Then
MsgBox "数据无效!", vbCritical
Cancel = True
End If
End If
End Sub
创建管理模块,用于注册控件:
Public MasterCollection As New Collection
Public Function AutoRegister(ByRef f As Form)
Dim ctl As Control
Dim obj As clsInputShield
For Each ctl In f.Controls
If ctl.ControlType = acTextBox Then
Set obj = New clsInputShield
Set obj.TargetControl = ctl
MasterCollection.Add obj
End If
Next
End Function
选择注册方式: 手动方式:在 Form 的 On Open 属性中填入:=AutoRegister([Form])
或使用自动批量注册(仅需运行一次):
Sub SetupAllForms()
Dim obj As AccessObject
For Each obj In CurrentProject.AllForms
DoCmd.OpenForm obj.Name, acDesign, , , , acHidden
Forms(obj.Name).OnOpen = "=AutoRegister([Form])"
DoCmd.Close acForm, obj.Name, acSaveYes
Next
MsgBox "已为所有表单启用系统!", vbInformation
End Sub
希望这些信息能对您有所帮助。如果您还有其他问题,欢迎随时留言。
注意:如果您希望收到本帖相关的邮件通知,请按照我们文档中的步骤启用电子邮件通知。