防止出现验证错误的双重实例

时间:2012-10-27 13:22:26

标签: excel vba

我遇到了一次验证三次下拉的问题。以下是测试用例:

cbo_fac1 - user must select this as a pre-requisite for cbo_fac1 and cbo_fac2
cbo_fac2 - user must select cbo_fac1 as a pre-requisite
cbo_fac3 - user must select cbo_fac1 and cbo_fac2 as a pre-requisite

这是我到目前为止使用的代码。不幸的是,在某些情况下,即如果用户首先尝试选择 cbo_fac3 ,则似乎循环了几个错误。有没有什么方法可以合并这些功能并让它只在每种情况下显示错误一次?

 Private Sub cbo_fac2_Enter()

    If Len(cbo_fac1.Value) = 0 Then
        MsgBox ("Please select a first preference before selecting a second preference")
        cbo_fac1.SetFocus
        Exit Sub
    End If

End Sub

Private Sub cbo_fac3_Enter()

    If Len(cbo_fac2.Value) = 0 & Len(cbo_fac3.Value) = 0 Then
        MsgBox ("Please select a first preference before selecting a second/third preference")
        cbo_fac1.SetFocus
        Exit Sub
    End If

    If Len(cbo_fac2.Value) = 0 Then
        MsgBox ("Please select a second preference before selecting a third preference")
        cbo_fac2.SetFocus
        Exit Sub
    End If

End Sub

1 个答案:

答案 0 :(得分:3)

这解决了另一端的问题,根据是否填写了以前的组合框来启用或禁用组合框。这里的级联事件是第3个组合框中的朋友,因为清除第1个组合触发了更改在第二,清除第三。将此代码添加到您的用户表单:

Private Sub cbo_fac1_Change()
With cbo_fac2
.Enabled = Len(cbo_fac1.Value) > 0
If Not .Enabled Then
    .ListIndex = -1
End If
End With
End Sub

Private Sub cbo_fac2_Change()
With cbo_fac3
    .Enabled = Len(cbo_fac2.Value) > 0
    If Not .Enabled Then
        .ListIndex = -1
    End If
End With
End Sub

请注意,如果您最终得到更长的系列,那么您将需要查看WithEvents控件类。

此外,尽可能尝试在用户输入控件时避免出现错误消息框。尝试用视觉线索引导它们 - 在这种情况下禁用,空控制 - 或者等到它们点击OK然后告诉他们需要改变什么。

如果有其他人想要尝试这个,请创建一个包含3个组合框的表单,然后将此初始化代码添加到表单中:

Private Sub UserForm_Initialize()
Dim i As Long

With Me
    With .cbo_fac1
        For i = 1 To 10
            .AddItem .Name & i
        Next i
    End With
    With .cbo_fac2
        For i = 1 To 10
            .AddItem .Name & i
        Next i
        .Enabled = False
    End With
    With .cbo_fac3
        For i = 1 To 10
            .AddItem .Name & i
        Next i
        .Enabled = False
    End With
End With
End Sub