Ошибка при возврате нескольких индексов из списка с помощью listbox multiselect

#excel #vba #listbox

#excel #vba #listbox

Вопрос:

Новичок в VBA и несколько разочарован. пытаюсь создать форму для моих коллег-учителей, чтобы упростить оформление документов.

У меня есть список в форме 1. яблоко
2. апельсин
3. виноград

Если пользователь должен был выбрать apple и grape из списка, я хочу, чтобы в ячейке были только индексы. Итак, чтобы напечатать (1,3) в ячейке. Мне не нужны слова.

Мой текущий код

 Private Sub SpedAccomAddBtn_Click()

'variable to count multiple selections'
VarSped = " "

'loop to keep track of indexes of selected items'
For X = 0 To Me.SpedListBx.ListCount - 1 'count through list
    If Me.SpedListBx.Selected(X) Then    
        If VarSped = " " Then  'if blank then record first item'
            VarSped = Me.SpedListBx.ListIndex   1 'first selected item.  1 because excel is a 0 based index'
        Else 'if not the first selection add a , between selections'
            VarSped = VarSped amp; "," amp; Me.SpedListBx.ListIndex   1
        End If
    End If
Next X

ThisWorkbook.Sheets("Master SPED Sheet").Range("c4") = VarSped 'print to cell'
  

Если я использую предыдущий пример выбора яблока и винограда, я получаю (3,3), а не (1,3). Я не могу понять, почему VarSped продолжает перезаписываться.
(Я новичок в программировании, и мне приходится все комментировать, поэтому я чувствую, что знаю, что делаю)

Ответ №1:

Попробуйте это и посмотрите, как ссылаться на текущий элемент внутри цикла:

 Private Sub SpedAccomAddBtn_Click()

Dim VarSped As String
Dim x As Integer

'variable to count multiple selections'
VarSped = " "

'loop to keep track of indexes of selected items'
For x = 0 To Me.SpedListBx.ListCount - 1 'count through list
    If Me.SpedListBx.Selected(x) Then
        If VarSped = " " Then  'if blank then record first item'
            VarSped = Me.SpedListBx.List(x) 'first selected item.  1 because excel is a 0 based index'
        Else 'if not the first selection add a , between selections'
            VarSped = VarSped amp; "," amp; Me.SpedListBx.List(x)
        End If
    End If
Next x

ThisWorkbook.Sheets("Master SPED Sheet").Range("c4") = VarSped 'print to cell'

End Sub
  

Комментарии:

1. это для меня возвращает значения (1. яблоко, 3. виноград), а не (1,3)

Ответ №2:

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

 Option Explicit

Private Sub SpedAccomAddBtn_Click()
    Dim VarSped As String ' a string is always initialized with a null string, i.e. with a "" string. hence no need for a 'VarSped = ""' statement

    Dim X As Long
    For X = 0 To Me.SpedListBx.ListCount - 1 'count through list
        If Me.SpedListBx.Selected(X) Then VarSped = VarSped amp; "," amp; X   1
    Next

    If VarSped <> vbNullString Then ThisWorkbook.Sheets("Master SPED Sheet").Range("c4") = Mid$(VarSped, 2) ' print 'VarSped' only if user selected something (i.e. 'VarSped' is not a not string). Mid$() function is used to skip the first character which is a colon 
End Sub
  

Заведите привычку размещать Option Explicit в самом верхнем углу каждого модуля и явно объявлять все ваши переменные: это сэкономит вам много времени на отладку и даст вам гораздо больше контроля над вашим кодом

Комментарии:

1. Я думаю, что понимаю код. итак, команда selected (x) возвращает индекс, я использовал неправильные команды. Спасибо.

2. Добро пожаловать. Selected(X) возвращается независимо X от того, выбран ли элемент th или нет, где X находится сам индекс