【问题标题】:populate combobox from an excel sheet based on listbox selection (multiselect enabled)根据列表框选择从 Excel 工作表中填充组合框(启用多选)
【发布时间】:2014-01-21 20:31:23
【问题描述】:

我有一个包含 3 个值并启用了多选选项的列表框。根据选择的值,我想通过引用 excel 表中的某些范围来填充组合框。如果从列表框中仅选择一个值,则以下代码有效。我知道它不适用于多项选择,但我无法编写代码来循环选择列表,然后将相应的范围添加到组合框。

所以,如果我选择 customer1 和 customer2,我希望在组合框中填充范围 d3:d34 和 c4:c24 中的值。其他组合也类似。但是,如果未选择其中一个值,则应从组合框中清除相应的值。

如果我要将列表框中的所有选定项目保存在一个数组中,我如何对存储在数组中的每个值进行“搜索”或“查找”?

请建议我如何修改此代码。

谢谢!

Private Sub Combobox1_DropButtonClick()

    Dim curSelected As String
    Dim i As Integer

    For i = 0 To Listbox1.ListCount - 1
        If Listbox1.Selected(i) Then
            curSelected = Listbox1.List(i)
                If curSelected = "customer1" Then
                    ChooseDeals.List = Sheets("Sheet3").Range("d4:d34").Value
                ElseIf curSelected = "customer2" Then
                    ChooseDeals.List = Sheets("Sheet3").Range("c4:c24").Value
                ElseIf curSelected = "customer3" Then
                    ChooseDeals.List = Sheets("Sheet3").Range("e4:e20").Value
                End If
          End If
    Next i


End Sub

【问题讨论】:

    标签: excel vba combobox listbox multi-select


    【解决方案1】:

    我最近做了类似的事情。我在选择放置组合框的单元格时调用了一个验证子。验证程序将动态检查单独维护的列表中有多少值,并相应地填充单元格的数据验证列表。可能必须创建一个单独的子将列表来更新列表。并且可以在填充数据验证列表之前调用此子程序。以下代码对我有用。您可能必须使用变体。

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    
    If Not Intersect(Target, Range("D7")) Is Nothing Then
    
        Call getValidation
    
    End If
    End Sub
    
    Sub getValidation()
    
    Dim j As Integer
    j = 0
    
       j = Range("Charts!XFA1").Offset(Sheet1.Rows.Count - 1, 0).End(xlUp).Row
    
    ' data list stored in Charts!XFA column. Found last row where the list ends.
    
    If j > 1 Then
    
    Range("QueryingTool!D7").Select  'D7 is the cell where data validation is used
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=Charts!$XFA7:$XFA" & j
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    End If
    
    End Sub
    

    【讨论】:

      【解决方案2】:

      我不知道有什么方法可以将ComboBox.List 设置为不连续的Range,所以我认为您不得不一次添加一个单元格的值。

      此代码利用了Range.Areas 属性,以及区域按照它们在分配中出现的顺序离散定义的事实。

      例如,如果您在“调试”窗口中键入:

      ? Activesheet.Range("B1,A1").Areas.Count 
      

      你得到 2,即使它是一个连续的范围,如果你定义它只会产生一个 Area

      ? Activesheet.Range("A1:B1").Areas.Count
      

      此外,如果您将第一个更改为:

      ? Activesheet.Range("B1,A1").Areas(1).Address
      

      即使“A1”出现在电子表格的前面,您也会得到“B1”。

      所以,我认为您可以使用它来“排列”您的 ListBox 项目及其选择的 Ranges

      Private Sub ComboBox1_DropButtonClick()
      Dim ws As Excel.Worksheet
      Dim FullRange As Excel.Range
      Dim RangeToUse As Excel.Range
      Dim i As Integer
      Dim cell As Excel.Range
      Dim AreaToUse
      
      Set ws = ThisWorkbook.Worksheets("Sheet3")
      Set FullRange = ws.Range("d4:d34,c4:c24,e4:e20")
      For i = 0 To ListBox1.ListCount - 1
          If ListBox1.Selected(i) Then
              If RangeToUse Is Nothing Then
                  Set RangeToUse = FullRange.Areas(i + 1)
              Else
                  Set RangeToUse = Union(RangeToUse, FullRange.Areas(i + 1))
              End If
          End If
      Next i
      If Not RangeToUse Is Nothing Then
          For Each AreaToUse In RangeToUse
              For Each cell In AreaToUse
                  ComboBox1.AddItem cell.Value
              Next cell
          Next AreaToUse
      End If
      End Sub
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-28
        • 1970-01-01
        相关资源
        最近更新 更多