【问题标题】:Dynamically selecting ListFillRange for ComboBox based on two previous ComboBoxes' values?根据前两个 ComboBoxes 的值动态选择 ComboBox 的 ListFillRange?
【发布时间】:2016-05-19 16:24:23
【问题描述】:

我目前有三个组合框(comboBox2、comboBox3、comboBox4)。 ComboBox2.ListFillRange 和 ComboBox3.ListFillRange 当前链接到命名范围。根据在 ComboBox2 和 ComboBox3 中选择的内容,ComboBox4 的 ListFillRange 会有所不同,即它看起来不同的名称范围。

       Private Sub ComboBox3_Change()

       Application.EnableEvents = True

        If ComboBox2.Value = "Internal" And ComboBox3.Value = "Breach" Then
            ComboBox4.ListFillRange = "=Internal_Breach"
       ElseIf ComboBox2.Value = "Internal" And ComboBox3.Value = "Error" Then
            ComboBox4.ListFillRange = "=Internal_Error"
       ElseIf ComboBox2.Value = "External" And ComboBox3.Value = "Breach" Then
            ComboBox4.ListFillRange = "=External_Breach"
       ElseIf ComboBox2.Value = "External" And ComboBox3.Value = "Error" Then
            ComboBox4.ListFillRange = "=External_Error"
       Else: ComboBox2.Value = "External" And ComboBox3.Value = "Error"
            ComboBox4.ListFillRange = "=External_Error"
      End If

      End Sub

当我为 ComboBox2 选择“内部”并为 ComboBox3 选择“Breach”时,我得到了 ComboBox4 所需的 ListFillRange。但是,如果我随后为 ComboBox2 选择“External”并将 ComboBox3 保留为“Breach”,我在 ComboBox4 中没有为“External”-“breach”组合获得预期的 ListFillRange,我必须重新选择“Breach”才能得到这个。有谁知道当我重新选择一个并离开另一个时如何让它自动更新?

【问题讨论】:

    标签: excel forms vba combobox


    【解决方案1】:

    这是因为您只有 ComboBox3_Change() 事件处理程序,只有在 ComboBox3 更改时才会触发。

    你必须创建一个 ComboBox2_Change() 事件处理程序,它必须做同样的工作

    因此您可以添加一个sub 以供任一事件处理程序调用

    此外,您还会遇到以下问题:

    Else: ComboBox2.Value = "External" And ComboBox3.Value = "Error"
                ComboBox4.ListFillRange = "=External_Error"
    End If
    

    因为它会导致:

    Else
          ComboBox2.Value = "External" And ComboBox3.Value = "Error"
          ComboBox4.ListFillRange = "=External_Error"
    End If
    

    因此在该行出现错误:

    ComboBox2.Value = "External" And ComboBox3.Value = "Error"
    

    对于工作表代码窗格中代码上方的所有内容可能是:

    Option Explicit
    
    Private Sub ComboBox2_Change()
        Application.EnableEvents = True
        Call CheckComboBoxes
    End Sub
    
    Private Sub ComboBox3_Change()
        Application.EnableEvents = True
        Call CheckComboBoxes
    End Sub
    
    Sub CheckComboBoxes()
        If ComboBox2.Value = "Internal" And ComboBox3.Value = "Breach" Then
            ComboBox4.ListFillRange = "=Internal_Breach"
        ElseIf ComboBox2.Value = "Internal" And ComboBox3.Value = "Error" Then
            ComboBox4.ListFillRange = "=Internal_Error"
        ElseIf ComboBox2.Value = "External" And ComboBox3.Value = "Breach" Then
            ComboBox4.ListFillRange = "=External_Breach"
        ElseIf ComboBox2.Value = "External" And ComboBox3.Value = "Error" Then
            ComboBox4.ListFillRange = "=External_Error"
        ElseIf ComboBox2.Value = "External" And ComboBox3.Value = "Error" Then
            ComboBox4.ListFillRange = "=External_Error"
        End If
    End Sub
    

    可以缩短为:

    Option Explicit
    
    Private Sub ComboBox2_Change()
        Application.EnableEvents = True
        Call CheckComboBoxes
    End Sub
    
    Private Sub ComboBox3_Change()
        Application.EnableEvents = True
        Call CheckComboBoxes
    End Sub
    
    Sub CheckComboBoxes()
        ComboBox4.ListFillRange = ComboBox2.Value & "_" & ComboBox3.Value
    End Sub
    

    【讨论】:

    • @maracuja 你通过了吗?
    猜你喜欢
    • 1970-01-01
    • 2019-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多