Перенос выбранных элементов из Listbox в следующую доступную ячейку в книге - PullRequest
0 голосов
/ 26 мая 2020

У меня есть Listbox1, и пользователи выбирают элементы для перемещения в Listbox2. Мне нужно переместить все из Listbox2 в Excel.

Затем пользовательская форма должна закрываться Me, и должна отображаться другая пользовательская форма (либо UF1, UF2, либо UF3; формула в G3 вычисляет, какая новая форма должна отображаться) .

Private Sub CommandButton2_Click()

    Dim i as integer
    Dim LastRow As Long

    LastRow = Sheets("EnteredData").Range("F" & Rows.Count).End(xlUp).Row
    
    If Me.ListBox2.ListCount = 0 Then
        MsgBox ("Please select at least one role")
    Else
        For i = 0 To ListBox2.ListCount - 1
            Sheets("EnteredData").Range("F" & LastRow).Offset(1, 0).Value = ListBox2.List(i)
            Me.ListBox2.RemoveItem i
        Next i
    End If
    Unload Me
    Sheets("EnteredData").Range("G3").Show
    
End Sub

Проблемы:

  1. Если Listbox2 содержит хотя бы два элемента, ошибка времени выполнения 381: не удалось получить свойство List. Недопустимый индекс массива свойств в строке Sheets("EnteredData").Range("F" & LastRow).Offset(1, 0).Value = ListBox2.List(i)
  2. Следующая пользовательская форма, вызванная в Sheets("EnteredData").Range("G3").Show, не отображает требуемую форму. Unload Me работает, но новая форма (например, UF1) не отображается.

1 Ответ

0 голосов
/ 26 мая 2020

Попробуйте это.

Потому что вы удаляете элементы, когда go ваш l oop ломается - всякий раз, когда вы удаляете что-либо, вам нужно l oop назад.

При этом , это приведет к тому, что ваши элементы будут перенесены в обратном направлении.

Чтобы избежать этого, мы не делаем oop назад (!), а удаляем все элементы в одном go в конце, используя Clear.

Наконец, но не в последнюю очередь, вам необходимо обновить переменную LastRow в l oop, чтобы избежать перезаписи (хотя вы могли бы вообще обойтись без нее).

Private Sub CommandButton1_Click()

Dim i As Long
Dim LastRow As Long

For i = 0 To ListBox2.ListCount - 1
    LastRow = Sheets("EnteredData").Range("F" & Rows.Count).End(xlUp).Row
    Sheets("EnteredData").Range("F" & LastRow).Offset(1, 0).Value = ListBox2.List(i)
Next i

Me.ListBox2.Clear

End Sub
...