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

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

Если бы пользователь выбрал в списке яблоко и виноград, я бы хотел, чтобы в ячейке были только индексы. Таким образом, чтобы напечатать (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 & "," & Me.SpedListBx.ListIndex + 1
        End If
    End If
Next X

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

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

0
Madison Hanks 13 Апр 2019 в 01:09

2 ответа

Лучший ответ

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

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 & "," & Me.SpedListBx.List(x)
        End If
    End If
Next x

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

End Sub
0
Ricardo Diaz 13 Апр 2019 в 03:02

Ваш итератор цикла уже является вашей позицией элемента: просто добавьте один к нему для управления списком на основе 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 & "," & 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 в самом топе каждого модуля и явно объявлять все свои переменные: это сэкономит вам много времени на отладку и даст вам гораздо больший контроль над вашим кодом

0
DisplayName 13 Апр 2019 в 16:22