动态使组合框在工作表更改时可见-VBA 2007

动态使组合框在工作表更改时可见-VBA 2007,vba,combobox,textbox,userform,worksheet,Vba,Combobox,Textbox,Userform,Worksheet,我创建了一个带有多页的用户表单。在其中一个多页上,我有一个组合的文本框和组合框。共有9个框挨在一起。它们都是它后面的excel表格的控制源。当用户在第一个框中输入数据时,它会动态创建另外9个框,对应于下一行。这个过程重复。现在,9th框是一个文本框,可见性设置为false。第8个框是一个组合框。如果第8个框中的值为“现有”,则第9个框的可见性为“真” 以下是动态创建其他文本框/组合框的方式: Private Sub Worksheet_Change(ByVal Target As Range)

我创建了一个带有多页的用户表单。在其中一个多页上,我有一个组合的文本框组合框。共有9个框挨在一起。它们都是它后面的excel表格的控制源。当用户在第一个框中输入数据时,它会动态创建另外9个框,对应于下一行。这个过程重复。现在,9th框是一个文本框,可见性设置为false。第8个框是一个组合框。如果第8个框中的值为“现有”,则第9个框的可见性为“真”

以下是动态创建其他文本框/组合框的方式:

Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Left(Target.Address, 2)
        Case Is = "$A"
        Dim cCntrl As Control
        Dim i As Integer
        For i = 0 To 8
        //skipping to case 7 and 8
        Case Is = 7
            Set cCntrl = UserForm1.Frame13.Controls.Add("Forms.ComboBox.1", "Login" & i & Target.Row + 1, True)
            With cCntrl
                .Width = UserForm1.ComboBox240.Width
                .Height = UserForm1.ComboBox240.Height
                .Top = (10 + UserForm1.ComboBox240.Height) * (Target.Row - 1)
                .Left = UserForm1.ComboBox240.Left
                .ControlSource = "'Multi Branch'!" & Chr(65 + i) & Target.Row + 1
                .List = Worksheets("Setup").Range("BILLING").Value
                .Style = fmStyleDropDownList
            End With
            Case Is = 8
                Set cCntrl = UserForm1.Frame13.Controls.Add("Forms.TextBox.1", "Login" & i & Target.Row + 1, True)
            With cCntrl
                .Width = UserForm1.TextBox287.Width
                .Height = UserForm1.TextBox287.Height
                .Top = (10 + UserForm1.TextBox287.Height) * (Target.Row - 1)
                .Left = UserForm1.TextBox287.Left
                .ControlSource = "'Multi Branch'!" & Chr(65 + i) & Target.Row + 1
                .Name = "BTwo" & (Target.Row - 1)
                .Visible = False
            End With
        End Select
    Next
以下是我当前更改可见性的方式:

        Case Is = "$H"
        If Target.Value = "Existing" Then
            UserForm1.Controls("BTwo" & Target.Row - 2).Visible = True
        Else
        If Target.Row = 2 Then Exit Sub
            UserForm1.Controls("BTwo" & Target.Row - 2).Visible = False
        End If
    End Select

这个方法在技术上是有效的,但只有在我离开第八个盒子之后。这似乎是一种OnExit式的举措。第一行我只是做了一个onchange事件,效果很好。关于如何在不必选择另一个框的情况下更改的可见性,您有什么想法吗?

为什么不为每个文本框/组合框控件执行
change
事件?然后,您可以对表单控件的其余部分执行这种验证。这发生在工作表更改时,因此我也需要动态创建事件。我认为这可以通过使用类模块来实现。有关示例,请参见。