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