删除在列表框(VBA)中选择的多行的代码

时间:2019-03-12 07:50:59

标签: excel vba listbox userform

当前,我进入一个项目,在那里我不得不为下面提到的活动编写代码。

我创建了一个带有多选列表框和一个命令按钮的用户窗体

a)ListBox用2列填充表源中的项目。

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 :(得分:0)

使用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

注意

您还应该提供以下情况:用户删除整个命名范围。