Excel 通过在VBA中选择删除列表框中的项
我有一个基于工作表范围的列表框。我在Userform中添加了一个按钮,每当单击该按钮时,它都会删除列表框中的选定项。每次有删除的项目时,删除的项目也应在我的工作表范围内删除下面是我删除列表框中项目的代码:Excel 通过在VBA中选择删除列表框中的项,excel,vba,Excel,Vba,我有一个基于工作表范围的列表框。我在Userform中添加了一个按钮,每当单击该按钮时,它都会删除列表框中的选定项。每次有删除的项目时,删除的项目也应在我的工作表范围内删除下面是我删除列表框中项目的代码: Private Sub btnRemove_Click() Dim i As Integer For i = 0 To ListBox1.ListCount - 1 If ListBox1.Selected(i) Then ListBox1.RemoveItem (i
Private Sub btnRemove_Click()
Dim i As Integer
For i = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(i) Then
ListBox1.RemoveItem (i)
End If
Next i
End Sub
如何删除工作表范围内的已删除项?谢谢!:) 由于您使用的是
.removietem()
方法,您必须通过其列表
属性而不是行源
设置列表框范围
然后,您可以在用户表单代码窗格中使用此代码:
Option Explicit
Dim listRng As Range '<-- declare a Userform scoped variable of 'Range' type to track the range whose content you fill your ListBox1 with (for instance, in Userform_Initialize())
Private Sub btnRemove_Click()
Dim i As Long
Dim rowsList As String
For i = ListBox1.ListCount - 1 To 0 Step -1
If ListBox1.Selected(i) Then
ListBox1.RemoveItem i
Else
rowsList = rowsList & i + 1 & " " '<-- update the rows to be confirmed
End If
Next i
If rowsList <> "" Then UpdateListRange Left(rowsList, Len(rowsList) - 1)
End Sub
Sub UpdateListRange (rowsList As String)
Dim addr As String
Dim iRow As Variant
Dim rowsListArr As Variant
rowsListArr = Split(rowsList)
For iRow = UBound(rowsListArr) To LBound(rowsListArr) Step -1
addr = addr & listRng(rowsListArr(iRow)).address(False, False) & ","
Next iRow
If addr <> "" Then addr = Left(addr, Len(addr) - 1)
Set listRng = listRng.Parent.Range(addr)
End Sub
Private Sub UserForm_Initialize()
With Worksheets("List").Range("C32:C41") '<-- change "List" to your actual worksheet name with the range whose content you fill ListBox1 list with
Me.ListBox1.List = Application.Transpose(.Cells) '<-- fill ListBox1 list
Set listRng = .Cells '<-- set the userform scoped range variable to track the "listbox filling" range
End With
End Sub
选项显式
由于您使用的是.removietem()
方法,因此必须通过其List
属性设置列表框范围,而不是使用RowSource
方法
然后,您可以在用户表单代码窗格中使用此代码:
Option Explicit
Dim listRng As Range '<-- declare a Userform scoped variable of 'Range' type to track the range whose content you fill your ListBox1 with (for instance, in Userform_Initialize())
Private Sub btnRemove_Click()
Dim i As Long
Dim rowsList As String
For i = ListBox1.ListCount - 1 To 0 Step -1
If ListBox1.Selected(i) Then
ListBox1.RemoveItem i
Else
rowsList = rowsList & i + 1 & " " '<-- update the rows to be confirmed
End If
Next i
If rowsList <> "" Then UpdateListRange Left(rowsList, Len(rowsList) - 1)
End Sub
Sub UpdateListRange (rowsList As String)
Dim addr As String
Dim iRow As Variant
Dim rowsListArr As Variant
rowsListArr = Split(rowsList)
For iRow = UBound(rowsListArr) To LBound(rowsListArr) Step -1
addr = addr & listRng(rowsListArr(iRow)).address(False, False) & ","
Next iRow
If addr <> "" Then addr = Left(addr, Len(addr) - 1)
Set listRng = listRng.Parent.Range(addr)
End Sub
Private Sub UserForm_Initialize()
With Worksheets("List").Range("C32:C41") '<-- change "List" to your actual worksheet name with the range whose content you fill ListBox1 list with
Me.ListBox1.List = Application.Transpose(.Cells) '<-- fill ListBox1 list
Set listRng = .Cells '<-- set the userform scoped range variable to track the "listbox filling" range
End With
End Sub
选项显式
Dim listRng As Range“如果您提供有关您的范围的更多信息,例如工作表中范围的位置以及数据的位置,您如何将范围分配给ListBox1,将更容易为您提供帮助?您是否在Listbox1属性ListFillRange中分配了它?您好,Shai Rado-范围仅从C32到C41。仅此而已。该范围中的值是“我的列表框”中包含的值。如果您提供有关您的范围的更多信息,例如工作表中的范围所在位置以及数据在其中的位置,您如何将范围分配给列表框1,将更容易为您提供帮助?您是否在Listbox1属性ListFillRange中分配了它?您好,Shai Rado-范围仅从C32到C41。仅此而已。该范围内的值是我的列表框中包含的值。@kruk22,你通过了吗?@kruk22,你通过了吗?