Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在更改字段时运行宏,而不是在该字段的原始条目上运行宏?_Vba_Ms Access - Fatal编程技术网

Vba 如何在更改字段时运行宏,而不是在该字段的原始条目上运行宏?

Vba 如何在更改字段时运行宏,而不是在该字段的原始条目上运行宏?,vba,ms-access,Vba,Ms Access,我创建了一个项目数据库,其中包括一个表单,表单中有一些字段供员工在项目启动时填写 第一个字段“ClientCode”是客户端的强制下拉列表(组合框) 为了避免意外更改此字段,我添加了“更改时”代码以显示警告消息: Private Sub ComboClientCode_Change() If MsgBox("Are you sure you want to change the client?", vbQuestion + vbYesNo) = vbNo Then DoCmd.RunCo

我创建了一个项目数据库,其中包括一个表单,表单中有一些字段供员工在项目启动时填写

第一个字段“ClientCode”是客户端的强制下拉列表(组合框)

为了避免意外更改此字段,我添加了“更改时”代码以显示警告消息:

Private Sub ComboClientCode_Change()
If MsgBox("Are you sure you want to change the client?", vbQuestion + vbYesNo) = vbNo Then
    DoCmd.RunCommand acCmdUndo
Else
    Exit Sub
End If
End Sub
它可以工作,但是我不希望它在有人开始新记录时运行,即第一次选择客户端

如何使此消息仅在更改原始条目时显示


我试着将它移动到“AfterUpdate”,但它做了同样的事情。

您可以在第一次更改组合框时更改其中一个“无关”属性

Private Sub ComboClientCode_Change()
    If ComboClientCode.ColumnHeads = False Then
        ComboClientCode.ColumnHeads = True
    Else
        If MsgBox("Are you sure you want to change the client?", vbQuestion + vbYesNo) = vbNo Then
            'DoCmd.RunCommand acCmdUndo
            Debug.Print "DoCmd.RunCommand acCmdUndo"
        Else
            Exit Sub
        End If
    End If
End Sub
应适用于此类型:

列出了上述选定类型的属性:

您可以运行此命令来更改现有的一个值(如果该值为):

Sub Switch()
    If ComboClientCode.Value <> "" Then
        ComboClientCode.ColumnHeads = True
    Else
        ComboClientCode.ColumnHeads = False
    End If
End Sub
Sub开关()
如果ComboClientCode.Value为“”,则
ComboClientCode.ColumnHeads=True
其他的
ComboClientCode.ColumnHeads=False
如果结束
端接头

好的,我还没有测试下面的任何代码,所以请告诉我它是否适合您。我提出了两种不同的解决方案,这取决于逻辑是否有效,解决方案是否有效

解决方案1:

使用change事件,检查combobox值,如果为空,则运行代码。我对此的担心是,当事件处理程序激发时,其中只有一个值,因为用户会更改该值以调用事件处理程序。尽管如此,代码看起来还是像下面这样

Private子组合clientcode\u Change()
如果Me.ComboClientCode.Value为“”,则
如果MsgBox(“您确定要更改客户端吗?”,vbQuestion+vbYesNo)=vbNo,则
DoCmd.RunCommand acCmdUndo
其他的
出口接头
如果结束
如果结束
端接头
解决方案2:

使用此解决方案,逻辑似乎比上述方法更合理。您将使用
UserForm\u Initialize()
事件处理程序设置组合框的默认值。然后,当用户从下拉列表中选择时,它将为该变量设置值,并防止不必要的弹出。请参阅下面的代码。您的userform模块应该如下所示

选项显式
以字符串形式显示代码
私有子用户表单_初始化()
sClientCode=Me.ComboClientCode.Value
端接头
私有子组合客户端代码_Change()
如果是sClientCode“”,则
如果MsgBox(“您确定要更改客户端吗?”,vbQuestion+vbYesNo)=vbNo,则
'立即设置值
sClientCode=Me.ComboClientCode.Value
DoCmd.RunCommand acCmdUndo
其他的
出口接头
如果结束
如果结束
端接头

为什么不检查是否已经选择了一个值?如中所示,我假设您的默认状态是空白选择或类似“选择客户端代码”的内容。你所需要做的就是运行一个检查,确保默认值不存在,然后运行代码。谢谢Dean De Villiers,这听起来像是我想要做的。默认状态为空。因此,我破解了代码,但失败了,得到消息“赋值左侧的函数调用必须返回Variant或Object”。我显然不知道我在做什么。你能告诉我我做错了什么吗?如果是Me.ComboClientCode“”,则MsgBox(“您确定要更改客户端吗?”,vbQuestion+vbYesNo)=vbNo DoCmd.RunCommand acCmdUndo Else Exit Sub End如果是通常情况,我尝试了此操作,但无效。我不知道为什么,没有“安置”房地产可能没什么帮助。我理解你的逻辑,我喜欢你的逻辑,但当我这么做的时候,我意识到,对于已经选定客户的现有项目,布局(或我使用的任何不相关的属性)不会改变。是的,然后使用另一个属性并在现有属性上运行宏,以便所有具有值的组合框与初始化代码的属性匹配。如果您的目的是打开每个文件并粘贴代码,那么您可以粘贴两个文件并运行其中一个文件。谢谢您。这似乎不起作用,专栏头目们似乎仍然是假的。我的最后期限有点紧,所以我决定暂时把这件事放在一边,以后再谈。你帮了我很大的忙,尤其是让我跳出框框思考问题。非常感谢,谢谢,迪恩,我两种方法都试过了。第一个看起来很完美,但它不起作用-没有消息,就像它不在那里一样。第二个解决方案也不起作用,但当我将代码放入其中时,它被分为三个子部分(不确定术语)。第一行是前两行代码(Option Explicit;Dim sClientCode As String),它实际上将自身添加到上一个子元素中。