防止发生validation错误的双重实例

我有一个问题,一次validation三个下拉菜单。 这里是testing用例:

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 

这是我目前使用的代码。 不幸的是,在一些情况下,即如果用户首先尝试selectcbo_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 

这从另一端接近问题,根据前一个是否填充来启用或禁用combobox。在第三个combobox的情况下,级联事件是您的朋友,因为清除第一个组合会触发第二个combobox中的变化,这清除了第三。 将此代码添加到您的用户表单中:

 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控件类。

此外,尽可能地尝试避免用户input控件时出现错误消息框。 尝试用视觉提示(在这种情况下是禁用的空控件)引导他们,或者等到他们点击OK,然后告诉他们他们需要改变的东西。

如果有其他人想要尝试这个,用3个combobox创build一个表单,然后把这个初始化代码添加到你的表单中:

 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