Код для удаления нескольких строк, выбранных в ListBox (VBA) - PullRequest
0 голосов
/ 12 марта 2019

В настоящее время я нахожусь в проекте, где я застрял написание кода для нижеупомянутой деятельности.

Я создал пользовательскую форму с множественным выбором Listbox и командной кнопкой

a) ListBox заполняет элементы из источника таблицы двумя столбцами.

Zone    Region
North   N1
North   N2
North   N3
North   N4
South   S1
South   S2
South   S3
South   S4
East    E1
East    E2

b) Командная кнопка предназначена для удаления элементов, выбранных в списке.

Теперь После того, как я нажму кнопку «Удалить командную кнопку», выбранные строки должны быть удалены в исходном источнике таблицы.

Проблема

Проблема, с которой я сталкиваюсь, заключается в том, что даже когда я выбираю 2 или более строк в списке, только последняя выбранная строка получает удалено .

Private Sub Cmd_Del_Click()
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    Dim i As Long


    For i = Me.LB_ZoneRegion.ListCount - 1 To 0 Step -1
        If Me.LB_ZoneRegion.Selected(i) = True Then
            sh.Range("A" & i + 2 & ":B" & i + 2).Select
            Selection.Delete
        End If
    Next i
    Call UserForm_Initialize
End Sub

Private Sub UserForm_Initialize()
    On Error Resume Next
    With Me.LB_ZoneRegion
        .Clear
        .ColumnCount = 2
        .ColumnHeads = True
        .ColumnWidths = "40;50"
        .RowSource = "ZoneRegion"
        .MultiSelect = fmMultiSelectMulti
    End With
End Sub

Нажмите на ссылку ниже, чтобы загрузить рабочий файл.https://drive.google.com/open?id=1P5wiW6WVFAVQBgixPuA7gqyacR1aktvi

Пожалуйста, помогите мне в этом.

1 Ответ

0 голосов
/ 20 марта 2019

Использование Union, чтобы избежать повторных удалений

Используя функцию Union, вы можете добавить все строки, которые нужно удалить, к объекту диапазона (например, DelRng) и, наконец, удалитьих через одну строку кода DelRng.Delete.

Пример кода, близкий к OP

Private Sub Cmd_Del_Click()
    Dim sh As Worksheet
    Dim DelRng As Range
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    Dim i As Long
    For i = 0 to Me.LB_ZoneRegion.ListCount - 1    ' no more need to loop backwards
        If Me.LB_ZoneRegion.Selected(i) = True Then
            If DelRng Is Nothing Then
                Set DelRng = sh.Range("A" & i + 2 & ":B" & i + 2)
            Else
                Set DelRng = Union(DelRng, sh.Range("A" & i + 2 & ":B" & i + 2))
            End If
        End If
    Next i
    Application.ScreenUpdating = False
    If Not DelRng Is Nothing Then DelRng.Delete    ' delete chosen rows (if any)
    Application.ScreenUpdating = True


End Sub

Примечание

Следует также предусмотреть случай, когда пользователь удаляет весь именованный диапазон.

...