添加两列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 

显示所需修改的照片

这是要修改的主要形式

我想它是这样的:

结果会是这样的

示例文件

下载上述用户表单样本

去做这个:

  1. 为ComboBox设置ColumnCount = 2

    在这里输入图像说明

  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 

表格内容在2列下拉列表中


通常情况下,您希望ComboBox.Text是用户友好的, ComboBox.Value是有用的东西 – 就像一些ID值:

Id |标题|类型

这样做的问题是ComboBox将始终使用其源中第一列的内容进行显示,因此您可以得到以下结果:

ComboBox.Text是“1”,但选择的项目是“1 |指环王|冒险”

解决方法是简单地隐藏第一列(即将其宽度设置为0 ):

我们有3列,但第一个非零宽度列包含用户友好的电影标题

由于valueColumn1Me.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.Value1ComboBox1.TextLord of the Rings :现在你的代码的其余部分不必处理string文字!