Excel VBA – 将值插入多列combobox

在Excel中,我在用户窗体上有两个combobox。 当我select第一个combobox时,它会过滤当前工作表中的行并在combobox2中显示值。

我想combobox2是一个多列combobox,所以我可以从一个工作表复制和粘贴多个值到另一个,但我不能获得多个值combobox2。 这是我一起入侵的代码。 我能够在combobox1中更改值时筛选结果,但combobox2显示的是单个值:

Private Sub ComboBox1_Change() Me.ComboBox2.Clear 'filter the results in combo box 2 when the user selects the different options in combo box 1 Dim wb As Workbook Dim ws As Worksheet Dim copyFrom As Range, aCell As Range Dim lRow As Long Dim strSearch As String Set wb = ThisWorkbook '~~> Set this to the worksheet where the autofilter is applied Set ws = wb.Worksheets("RegEvents") '~~> Filter Column on text in Combo box 1 strSearch = ComboBox1.Value With ws '~~> Remove any filters .AutoFilterMode = False With .Range("RegEvents_WorksheetData") .AutoFilter Field:=Range("RegEvents_Action").Column, Criteria1:="=" & strSearch '~~> Identify the filtered range Set copyFrom = .Offset(1, 0).SpecialCells(xlCellTypeVisible) '~~> Add values from filtered search to Combobox2 For Each aCell In copyFrom If aCell.Value <> "" And aCell.Column = Range("RegEvents_EventID").Column Then ComboBox2.AddItem (aCell.Value) End If If aCell.Value <> "" And aCell.Column = Range("RegEvents_Event").Column Then ComboBox2.AddItem (aCell.Value) End If Next End With '~~> Remove any filters .AutoFilterMode = False End With End Sub Private Sub UserForm_Initialize() 'Used to create an array Dim listItems As Variant Me.ComboBox1.ListIndex = -1 ' -1 = no items selected Label1.Caption = "Action" Label2.Caption = "Event" listItems = Range("CatogriesAction") With ComboBox1 'Loops through the array and only adds non blank values to the combo box For i = 1 To UBound(listItems, 1) If Len(Trim(listItems(i, 1))) > 0 Then .AddItem listItems(i, 1) ' populate the listbox End If Next i .ListIndex = 0 ' -1 = no items selected, set to 0 to select the first item End With 'Set number of columns for combobox 2 With Me.ComboBox2 .ColumnCount = 2 .BoundColumn = 2 .ColumnWidths = ".5 in; .5 in" End With End Sub 

对于多列ComboBox,您必须使用.List属性填充列数据。 所以在你的情况下:

 For Each aCell In copyFrom If aCell.Value <> "" And aCell.Column = Range("RegEvents_EventID").Column Then ComboBox2.AddItem aCell.Value lRow = aCell.Row End If If aCell.Row = lRow And aCell.Column = Range("RegEvents_Event").Column Then With ComboBox2 .List(.ListCount - 1, 1) = aCell.Value End With End If Next 

使用.TextColumn显示文本字段中的两个列的完整示例。 要求:与ComboBox1 UserForm

 Private Sub UserForm_Initialize() With Me.ComboBox1 .ColumnCount = 3 .BoundColumn = 2 .TextColumn = 3 .ColumnWidths = "1cm;1cm;0" End With RegEvents_EventID = [{1;2;3;4;5}] RegEvents_Event = [{"Event 1";"Event 2";"Event 3";"Event 4";"Event 5"}] For i = LBound(RegEvents_EventID) To UBound(RegEvents_EventID) With Me.ComboBox1 .AddItem RegEvents_EventID(i, 1) .List(.ListCount - 1, 1) = RegEvents_Event(i, 1) .List(.ListCount - 1, 2) = RegEvents_EventID(i, 1) & " " & RegEvents_Event(i, 1) End With Next End Sub