我有一个带有列表框的用户窗体,使用列表对象作为行源。
我想从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
我有删除一行的代码。这是为了尝试删除多行。
我可以从列表框中选择多行数据,但无论选择顺序如何,它只会删除最底部的一行数据。
我在评论中的代码中犯了一个错误,即这一行
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)。
因为这只是一个测试子,您需要在显示用户表单之前激活工作表数据,以查看它是否删除了表中的正确行。