添加两列vba userformcombobox
我有用于股票控制,用于进出项目,所有我想要做的修改下面的代码,以显示每个项目名称旁边的代码进行search项目。 码:
Private Sub ComboBox1_Click() Dim i As Integer Dim j As Integer Dim final As Integer Dim FINAL2 As Integer For i = 2 To 1000 If Hoja5.Cells(i, 1) = "" Then final = i - 1 Exit For End If Next For i = 2 To 1000 If Hoja6.Cells(i, 1) = "" Then FINAL2 = i - 1 Exit For End If Next For i = 2 To final If ComboBox1 = Hoja5.Cells(i, 1) Then TextBox1 = Hoja5.Cells(i, 2) Exit For End If Next For j = 1 To FINAL2 If ComboBox1 = Hoja6.Cells(j, 1) Then TextBox8 = Hoja6.Cells(j, 3) Exit For End If Next End Sub Private Sub ComboBox1_Enter() Dim i As Integer Dim j As Integer Dim H As Integer Dim final As Integer Dim tareas As String ComboBox1.BackColor = &H80000005 For i = 1 To ComboBox1.ListCount ComboBox1.RemoveItem 0 Next i For j = 2 To 1000 If Hoja5.Cells(j, 1) = "" Then final = j - 1 Exit For End If Next For H = 2 To final tareas = Hoja5.Cells(H, 1) ComboBox1.AddItem (tareas) Next 'End If End Sub
显示所需修改的照片
我想它是这样的:
示例文件
下载上述用户表单样本
去做这个:
-
为ComboBox设置
ColumnCount
= 2 -
通过
ComboBox1.Column(1,{rowIndex})
='value'来设置第二列的值。 在你的代码中。 应该是这样的:For i = 2 To final tareas = Hoja5.Cells(i, 1) ComboBox1.AddItem (tareas) '-- set the first column ComboBox1.Column(1, i - 2) = Hoja5.Cells(i, 2) 'the name Next
此代码将填充combobox以及调整其设置以显示您的产品。 如果您使用它,您将无法添加或删除combobox中的项目。 您将不得不编辑工作表上的实际列表。
-
.RowSource = "OFFSET(PRODUCT!$A$1,1,0,COUNTA(PRODUCT!$A:$A)-1,3)"
将combobox列表链接到工作表上的dynamic列表。 它会随着列表的增长而增长。 -
.ColumnCount = 3
将Combobox设置为显示3列 -
.ColumnWidths = "100pt;100pt;200pt"
设置每列的宽度 -
.ListWidth = "400pt"
设置下拉的宽度。 我做了更大的实际combobox。
Private Sub UserForm_Initialize() With ComboBox1 .RowSource = "OFFSET(PRODUCT!$A$1,1,0,COUNTA(PRODUCT!$A:$A)-1,3)" .ColumnCount = 3 .ColumnWidths = "100pt;100pt;200pt" .ListWidth = "400pt" End With End Sub
您需要指定ColumnCount
值,并为List
属性提供一个数组。 如果需要,还可以指定一个包含ColumnWidths
属性的列宽度逗号分隔列表的string:
Option Explicit Public Sub PopulateComboBox(ByVal source As Range, Optional ByVal valueColumn As Long = 1, Optional ByVal hasHeader As Boolean = True) With Me.ComboBox1 .ColumnCount = source.Columns.Count .ColumnWidths = GetColumnWidths(source) .ListWidth = IIf(ComboBox1.Width > source.Width, ComboBox1.Width, source.Width) .List = source.Range(source.Rows(IIf(hasHeader, 2, 1)).EntireRow, source.Rows(source.Rows.Count).EntireRow).Value .BoundColumn = valueColumn End With End Sub Private Function GetColumnWidths(ByVal source As Range) As String Dim cols As Long cols = source.Columns.Count Dim widths() ReDim widths(1 To cols) Dim col As Long For col = 1 To cols widths(col) = source(, col).Width Next GetColumnWidths = Join(widths, ",") End Function
假设你在工作表上有一个ListObject
:
与UserForm1
实例一起工作的代码负责调用PopulateComboBox
方法:
Option Explicit Sub Test() With New UserForm1 .PopulateComboBox Sheet1.ListObjects(1).Range .Show vbModal End With End Sub
通常情况下,您希望ComboBox.Text
是用户友好的, ComboBox.Value
是有用的东西 – 就像一些ID值:
这样做的问题是ComboBox
将始终使用其源中第一列的内容进行显示,因此您可以得到以下结果:
解决方法是简单地隐藏第一列(即将其宽度设置为0
):
由于valueColumn
是1
, Me.ComboBox1.BoundColumn
指的是隐藏的ID列,所以当我们这样做:
Private Sub ComboBox1_AfterUpdate() If Not IsNull(ComboxBox1.Value) Then Debug.Print ComboBox1.Value, ComboBox1.Text End Sub
在select“指环王”之后,这就是直接窗格 中的内容 :
1 Lord of the Rings
ComboBox1.Value
是1
, ComboBox1.Text
是Lord of the Rings
:现在你的代码的其余部分不必处理string文字!