如何从使用列表对象作为 Excel VBA 行源的列表框中删除多个选定的数据行?

问题描述 投票:0回答:1

我有一个带有列表框的用户窗体,使用列表对象作为行源。

我想从listbox中选择多行数据,从listobject中删除相应的数据,然后更新listbox

Private Sub Delete_Click()

'Option Explicit is enabled

    Dim ws As Worksheet
    Dim tbl As ListObject
    Dim myListBox As MSForms.listbox
    Dim i As Long
    
    Set ws = ThisWorkbook.Worksheets("Data")
    Set tbl = ws.ListObjects("Table1")
    Set myListBox = Me.listbox
    
    With myListBox
        For i = .ListCount - 1 To 0 Step -1
            If .Selected(i) Then
                tbl.ListRows(i + 1).Delete
            End If
        Next i
    End With
    
    myListBox.RowSource = ""
    myListBox.RowSource = tbl
End Sub

我有删除一行的代码。这是为了尝试删除多行。

我可以从列表框中选择多行数据,但无论选择顺序如何,它只会删除最底部的一行数据。

excel vba listbox listobject
1个回答
0
投票

我在评论中的代码中犯了一个错误,即这一行

ListBox1.RowSource = .Range.Address
。应该是
ListBox1.RowSource = tbl.Range.Address
。更好的是,如果工作表数据不活动:
ListBox1.RowSource = ws.Name & "!" & tbl.Range.Address

要测试下面的代码,请创建一个带有一个列表框和一个命令按钮的用户窗体。

Dim ws As Worksheet
Dim tbl As ListObject

Private Sub UserForm_Initialize()
Set ws = ThisWorkbook.Worksheets("Data")
Set tbl = ws.ListObjects("Table1")
    With ListBox1
        .ColumnCount = 3
        .RowSource = ws.Name & "!" & tbl.Range.Address
        .ColumnWidths = "35,35,35"
        .MultiSelect = fmMultiSelectExtended
    End With
End Sub

Private Sub CommandButton1_Click()
Dim rgU As Range: Dim i As Integer
If Not tbl.DataBodyRange Is Nothing Then
    With ListBox1
        For i = 0 To .ListCount - 1
            If .Selected(i) And i <> 0 Then If rgU Is Nothing Then Set rgU = tbl.ListRows(i).Range Else Set rgU = Union(rgU, tbl.ListRows(i).Range)
        Next
        rgU.Delete: .RowSource = ws.Name & "!" & tbl.Range.Address
    End With
End If
End Sub

列表框的行源使用表地址,但在我的评论中我忘记包含工作表的名称(即工作表数据),以防显示用户窗体时工作表数据不活动。现在在上面的代码中我包含了工作表名称(ws.name)。

因为这只是一个测试子,您需要在显示用户表单之前激活工作表数据,以查看它是否删除了表中的正确行。

© www.soinside.com 2019 - 2024. All rights reserved.