2016-08-31 2 views
2

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

Вот мой UserForm: UserForm with ListBoxКак получить выбранное значение в многоколоночном списке


Так же, как на фото, я хочу, чтобы выбрать одну строку, то нажмем кнопку Associer и я мог бы получить информацию в этой строке. Я могу просто получить первый столбец, который является CAN20168301436. Я хочу получить информацию из всей строки.
Как я могу это сделать?
Вот моя кнопка нажата событие:

Private Sub CommandButton3_Click() 
    a = ListBoxResultatFind.Text 
End Sub 

ответ

7

вы можете использовать этот код

Private Sub CommandButton3_Click() 
    Dim strng As String 
    Dim lCol As Long, lRow As Long 

    With Me.ListBox1 '<--| refer to your listbox: change "ListBox1" with your actual listbox name 
     For lRow = 0 To .ListCount - 1 '<--| loop through listbox rows 
      If .selected(lRow) Then '<--| if current row selected 
       For lCol = 0 To .ColumnCount - 1 '<--| loop through listbox columns 
        strng = strng & .List(lRow, lCol) & " | " '<--| build your output string 
       Next lCol 
       MsgBox "you selected" & vbCrLf & Left(strng, (Len(strng) - 1)) '<--| show output string (after removing its last character ("|")) 
       Exit For '<-_| exit loop 
      End If 
     Next lRow 
    End With 
End Sub 
+0

Появится ли показания _brave_ downvoter и дадут объяснения, чтобы оба знали, почему они не должны следовать за ответом и научить меня, как его улучшить? – user3598756

1

С одной колонке вы можете получить значение, как показано ниже:

Dim str as String 
str = me.ListBox1.Value 

С Multicolumn вы можете получить значение, как это:

Dim strCol1 as String 
Dim strCol2 as String 
Dim strCol3 as String 
strCol1 = ListBox1.List(0, 1) 
strCol2 = ListBox1.List(0, 2) 
strCol3 = ListBox1.List(0, 3) 

или вы можете добавить все данные в 1 строку:

Dim strColumns as String 
strColumns = ListBox1.List(0, 1) + " " + ListBox1.List(0, 2) + " " + ListBox1.List(0, 3) 
+0

Спасибо за ваш réponse, я проверил, он может просто получить CAN20168301436, но не может получить всю информацию, это мульти-Колонн ListBox –

+0

@YiaoSun сколько столбцов? – DragonSamu

+0

У этого есть 7 колоний –

4

Нет необходимости в цикле весь список - для того, чтобы получить выбранную строку элемента вы можете использовать ListIndex свойство. Затем вы можете использовать List(Row, Column) свойство извлечь данные, как и в примерах по @DragonSamu и @ user3598756:

'***** Verify that a row is selected first 
If ListBoxResultatFind.ListIndex > -1 And ListBoxResultatFind.Selected(ListBoxResultatFind.ListIndex) Then 
    '***** Use the data - in my example only columns 2 & 3 are used 
    MsgBox ListBoxResultatFind.List(ListBoxResultatFind.ListIndex, 1) & ":" & ListBoxResultatFind.List(ListBoxResultatFind.ListIndex, 2) 
End If 
+0

Вы проверили это? В моем Excel VBA до 2013 года многостолбцовое свойство ListBox' ListIndex' возвращало бы '0', если не было выбрано ни одного элемента, как если бы первый элемент был бы. Вот почему я повторяю строки и проверяю свойство «Selected». Альтернативой была бы двойная проверка на '0'' ListIndex', например 'If .ListIndex = 0 и .Selected (0) или .ListIndex> 0 Then', но это выглядело бы слишком непонятным для обзора кода в течение 24 секунд – user3598756

+1

@YiaoSun : согласно моему предыдущему комментарию, вы можете протестировать это решение против возможного сценария _no-selection_ – user3598756

+0

@ user3598756 Никакой выбор не дает ListIndex = -1, поэтому я тестирую 'ListIndex> -1'. (Я использую Excel 2010, где он работает как шарм!) –

0

Это окно списка 6column и третий столбец будет множитель, следовательно, «(х)» , Вы также можете изменить список так, как вам нравится.

Private Function selList() As String 
Dim i As Long 

For i =LBound(lstListBox1.List) To UBound(lstListBox1.List) 
    If lstListBox1.Selected(i) Then 
     selList = selList & lstListBox1.List(i) & " " & lstListBox1.List(i, 1) _ 
     & "(x" & lstListBox1.List(i, 3) & ")" & " " & lstListBox1.List(i, 2) & " " & lstListBox1.List(i, 4) & ", " 
    End If 
Next i 

If selList= "" Then 
    selList= "" 
Else 
    selList= Left(selList, Len(selList) - 2) 
End If 

MsgBox selList 
End Function 
Смежные вопросы