根据另一个字段的值启用/禁用某些字段的输入

时间:2014-01-04 16:37:59

标签: ms-access expression ms-access-2010

在frmlastweeksactivities的数据输入表单中。当一行有" Gold"或" Silver"或者"青铜"作为[“活动类别”]字段/列中的内容,然后禁用列/字段[5]& [6]

当一行有" Wood"或者" Hay"或" Stubble"作为[“活动类别”]字段/列中的内容然后禁用列/字段[8]& [9]

禁用意味着在这种情况下不允许任何数据输入将它们变为红色

我正在尝试构建和表达,以便在表格验证规则属性中使用,或者在表单中的一个控制-txt框中使用

1 个答案:

答案 0 :(得分:3)

编辑:使用表级验证的解决方案

表级解决方案不会禁用字段,它所做的就是在添加记录时验证记录。如果验证规则失败(评估为FALSE),则将向用户显示警告消息,并且将取消更新(记录未添加)。

应将此表达式输入Validation Rule表格属性中,如下所示:

IIf((([category]="gold" Or [category]="silver" Or [category]="bronze") And (Len([Field5])>0 Or Len([Field6])>0)) 
 Or (([category]="Wood" Or [category]="stubble" Or [category]="hay") And (Len([Field8])>0 Or Len([Field9])>0))
,False,True)

警告:请确保支架按照上述表达方式排队!!

表达式很乱,但它测试你描述的2个“失败条件”中的任何一个是否为真,即:

1)类别=金/银/铜并且在Field5 / Field6

中不是空值

2)Category = wood / stubble / hay而不是Field8 / Field9中的null值

然后在表属性表的Validation Text属性中输入您希望通知用户其记录失败并需要更正的文本,然后才能保存记录。例如:

"If category is gold/silver/bronze then Field5 and Field6 must be blank, if wood/stubble/hay then Field8 and Field9 blank.  Record not saved, please correct before saving."

以下是设计视图中表格的屏幕截图,显示了属性表和您需要更改的2个属性。


更好:使用事件驱动验证的解决方案&控制表格中的锁定

鉴于Access表级和字段级验证不能满足要求,该解决方案将在表单上使用事件驱动的验证。它假定您的表单包含名为categoryField5Field6Field8Field9的文本框控件。

在设计视图中使用表单,右键单击category字段(或同时按ALTENTER)以查看控件的属性。在屏幕右侧的“属性表”中,单击Events选项卡。这将显示所选控件的可能事件。请参见下面的屏幕截图。

您对After Update事件感兴趣,因此请点击它,然后点击右边的...。选择Code Builder将为表单打开一个新的VBA模块,并自动为您创建一个事件。

Private Sub category_AfterUpdate()

    ' by default enable all four fields 5/6/8/9
    Me.Field5.Enabled = True
    Me.Field6.Enabled = True
    Me.Field8.Enabled = True
    Me.Field9.Enabled = True

    ' test the value entered by user in the category field and hide fields as required
    Select Case Me.category
        Case "Gold", "Silver", "Bronze"
            ' if the user has entered Gold, Silver or Bronze lock Fields 5/6
            Me.Field5.Enabled = False
            Me.Field6.Enabled = False
        Case "Wood", "Stubble", "Hay"
            ' if the user has entered Gold, Silver or Bronze lock Fields 8/9
            Me.Field8.Enabled = False
            Me.Field9.Enabled = False
    End Select

End Sub

因此,上面的代码将确保当用户更新category字段时,SubEnd Sub之间的代码将会运行,并且此代码会为Enabled属性设置根据你的逻辑你提到的字段。如果设置为Enabled,则此False属性将锁定字段变为活动状态(接受光标)并将其灰显,以便用户知道它已被禁用。

最后,当用户移动到新记录时,您需要再添加一段代码,将4个字段重置为Enabled。因此,回到设计视图中的表单,通过单击表单的一部分而不是控件来访问Form对象本身的属性。例如,单击表单页眉或页脚。当您看到表单的事件属性时,您将看到名为Current的事件。这是您使用...按钮以与上述相同的方式创建事件过程所需的过程。这将再次进入VBA窗口,您需要确保在那里输入以下代码:

Private Sub Form_Current()

    ' by default enable all four fields 5/6/8/9
    Me.Field5.Enabled = True
    Me.Field6.Enabled = True
    Me.Field8.Enabled = True
    Me.Field9.Enabled = True

End Sub

这是VBA屏幕应该如何显示其中所有代码的屏幕截图。

当您现在保存并运行表单时,它应该完全按照您的意愿运行。如有任何问题或疑问请发表评论,我会尽力协助。