2016-09-10 2 views
0

У меня есть эта пользовательская форма для управления запасами, которая использовалась для ввода или вывода элементов, все, что я хочу сделать, чтобы изменить приведенный ниже код, чтобы показать каждое имя элемента рядом с его кодом, чтобы сделать поиск предметов. Код:добавление двух столбцов в vba userform combobox

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 

фото с указанием требуемой поправки

this is the main form to be modified

Я хочу, чтобы это было как:

the result would be like this

файл образца

download sample for the above userform

ответ

2

Для этого:

  1. Установите ColumnCount = 2 для ComboBox

    enter image description here

  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

+0

@AElsheikh Не забудьте принять его ответ. Он не только заработал, но и закрыл вопрос; что позволяет быстрее отвечать на другие вопросы. –

1

Вы должны указать значение ColumnCount, а также обеспечить массив для List свойства. Если вы хотите, вы также можете указать строку, содержащую список разделенных запятыми ширин столбцов для ColumnWidths собственности, также:

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 на листе:

Title | Genre; a table with a handful of movies

Код, который работает с экземпляром UserForm1, отвечает за вызов метода PopulateComboBox:

Option Explicit 

Sub Test() 
    With New UserForm1 
     .PopulateComboBox Sheet1.ListObjects(1).Range 
     .Show vbModal 
    End With 
End Sub 

table contents in a 2-column dropdown


Довольно часто вы хотите ComboBox.Text быть что-то удобно, и ComboBox.Value быть что-то полезное - как-то ID значения:

Id | Title | Genre

Проблема с делать это является что ComboBox всегда будет использовать содержимое первого столбца в своем источнике для отображения, так что вы получите это:

ComboBox.Text is "1" but selected item is "1 | Lord of the Rings | Adventure"

Решение состоит в том, чтобы скрыть первый столбец (т.установить его ширину в 0):

we have 3 columns, but the first non-zero width column contains user-friendly film titles

С valueColumn является 1, Me.ComboBox1.BoundColumn ссылается на скрытый столбец ID, так что, когда мы делаем это:

Private Sub ComboBox1_AfterUpdate() 
    If Not IsNull(ComboxBox1.Value) Then Debug.Print ComboBox1.Value, ComboBox1.Text 
End Sub 

Это то, что напечатано в немедленная панель после выбора Властелин Колец:

1   Lord of the Rings 

ComboBox1.Value is 1, и ComboBox1.Text is Lord of the Rings: теперь остальная часть вашего кода не должна иметь дело со строковыми литералами!

+1

Это довольно крутая идея, которая устанавливает ширину столбцов, используя ширину столбцов таблицы Products. Вдоль тех же строк, возможно, вы должны установить ширину списка папок, используя ширину таблиц: ComboBox1.ListWidth = Worksheets («PRODUCT»). ListObjects (1) .Range.Width –

+0

@ThomasInzina спасибо! это хорошая идея, но я бы тоже учитывал собственную ширину combobox, она выглядит странно, когда список уже, чем сам раскрывающийся список. Как насчет '.ListWidth = IIf (ComboBox1.Width> source.Width, ComboBox1.Width, source.Width)'? =) –

+0

Спасибо за Кудо. Я работал с вашими концепциями; пытаясь уточнить мои знания объектов range/table в отношении элементов управления списками. Я воспроизвел ваш стол и назвал его фильмами. Ниже приведено то, что я придумал: –

1

Этот код заполнит поле со списком, а также отрегулирует его настройки для отображения ваших продуктов. Если вы его используете, вы не сможете добавлять или удалять элементы из выпадающего списка. Вам нужно будет отредактировать фактический список на листе.

  • .RowSource = "OFFSET(PRODUCT!$A$1,1,0,COUNTA(PRODUCT!$A:$A)-1,3)" Ссылки на список combobox на динамический список на листе. Он будет сгибаться и расти вместе с этим списком.
  • .ColumnCount = 3 Устанавливает ComboBox для отображения 3 столбцов
  • .ColumnWidths = "100pt;100pt;200pt" устанавливает ширину каждого столбца
  • .ListWidth = "400pt" устанавливает ширину выпадающего. Который я сделал больше, чем фактическое поле со списком.

enter image description here


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 
+0

Немного менее гибко, чем мое решение, но, безусловно, выполняет свою работу. Престижность для работы с файлом OP! –