0

一度に3つのドロップダウンを検証するのに問題があります。テストケースは次のとおりです。

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を選択しようとすると、いくつかのエラーがループしているように見えます。これらの関数をマージして、それぞれの場合に1回だけエラーを表示する方法はありますか?

 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
4

1 に答える 1

3

これはもう一方の端から問題にアプローチし、前のコンボボックスが入力されているかどうかに基づいてコンボボックスを有効または無効にします。ここでは、3番目のコンボボックスの場合、1番目のコンボボックスをクリアすると、2番目のコンボボックスが変更されるため、カスケードイベントは友だちです。 、3番目をクリアします。次のコードをユーザーフォームに追加します。

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
于 2012-10-27T14:50:44.400 に答える