#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
находится сам индекс