[英]Excel VBA - inserting values into multicolumn combobox
我在Excel的用戶表單上有兩個組合框。 當我選擇第一個組合框時,它將過濾當前工作表上的行並在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.