以Control.BeforeUpdate = "函数名1()"的方式设置该事件,怎样将'函数名1()'运算的Boolean结果返回给事件BeforeUpdate的参数Cancel,让事件BeforeUpdate知道是否通过了函数验证

何尧 120 信誉分
2026-02-20T04:37:58.6933333+00:00

如题。

我想在窗体模块中只对特殊的情况才写专用代码,其它情况则在一个指定程序进行赋值,这样可以将注意力放在后台控制。但是不知道怎样将函数的运算结果与事件BeforeUpdate.Cancel关联起来,因为BeforeUpdate事件的目的是验证,而不是执行。

Microsoft 365 和 Office | Access | 家庭版 | Windows
0 个注释 无注释
{count} 票

问题作者接受的答案
  1. Gabriel-N 14,755 信誉分 Microsoft 外部员工 仲裁人
    2026-02-20T07:02:22.09+00:00

    注:此回复已自动翻译。因此,它可能包含语法错误或表达尴尬。

    你好 何尧

    感谢你在 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
     
    
    

    希望这些信息能对您有所帮助。如果您还有其他问题,欢迎随时留言。


    注意:如果您希望收到本帖相关的邮件通知,请按照我们文档中的步骤启用电子邮件通知。

    1 个人认为此答案很有帮助。

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,版主可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。