根据列表框选择从Excel工作表填充组合框(启用多选)

时间:2014-01-04 02:20:17

标签: excel vba combobox listbox multi-select

我有一个列表框,其中包含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

2 个答案:

答案 0 :(得分:0)

我不知道有任何方法可以将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

答案 1 :(得分:0)

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

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