Excel 从listbox用户表单中删除行
我有一个显示excel工作表行的列表框,我需要添加一个删除按钮来删除所选行。我试过这个Excel 从listbox用户表单中删除行,excel,vba,Excel,Vba,我有一个显示excel工作表行的列表框,我需要添加一个删除按钮来删除所选行。我试过这个 Private Sub CommandButton3_Click() Dim i As Integer For i = 0 To Range("A65356").End(xlUp).Row - 1 If lstDisplay.Selected(i) Then Rows(i).Select Selection.Delete End If Next i End S
Private Sub CommandButton3_Click()
Dim i As Integer
For i = 0 To Range("A65356").End(xlUp).Row - 1
If lstDisplay.Selected(i) Then
Rows(i).Select
Selection.Delete
End If
Next i
End Sub
但当我尝试删除例如第10行时,删除的是第9行,它总是删除选中行之前的行
有办法吗
谢谢大家我建议大家:
Private Sub CommandButton3_Click()
Dim i As Integer
For i = 1 To Range("A65356").End(xlUp).Row - 1
If lstDisplay.Selected(i) Then
Rows(i).Delete
i = i - 1
End If
Next i
End Sub
另外请注意行(i).删除与行(i)完全相同。选择选择选择。删除,但应尽可能避免选择
如前所述:
您可以使用代码模块顶部的“Option Base 1”声明将默认下限更改为1而不是0。
例如:
Option Base 1
Dim arValues(10) As String 'contains 10 items (not 11)
我必须自己测试一下,但我想大致如下:
Private Sub CommandButton3_Click()
Dim i As Long, rng As Range
With Me.lstDisplay
For i = 0 To .ListCount - 1
If .Selected(i) Then
If Not rng Is Nothing Then
Set rng = Union(rng, Sheets("Sheet1").Rows(i + 1))
Else
Set rng = Sheets("Sheet1").Rows(i + 1)
End If
End If
Next i
End With
rng.EntireRow.Delete
End Sub
这样,您只需执行一次删除行的操作
顺便说一句,我期待一个多选列表框。如果不是multiselect,则会简化代码,因为不需要循环listbox。因为listbox数组基于0,所以必须在行号中添加1以匹配基于excel 1的行。因此,行(i+1).EntireRow.Delete将起作用。无需在2行中选择和删除。因此,尽量避免使用范围(“A65356”)。结束(xlUp)。行
,因为它有点像2003年的版本。现在我们使用.Cells(.Rows.Count,1).End(xlUp).Row
的变体与带有工作表的组合(“sheetname”)
您看到了吗<当i
=0时,代码>行(i)
将不工作。此外,删除行时,您希望从末尾开始并向上移动。另外-不要在循环中修改i
。请注意,将其更改为For i=1
也不起作用,因为listbox数组是基于0的,所以现在您将跳过第一个元素。@BigBen我同意i=0
,但您也可以删除从工作表bot顶部开始的行,每次删除行时只需设置i=i-1在循环中修改i
,这是一种糟糕的做法。不要。使用步骤-1向后循环。你最近的编辑仍然有问题。或者只删除一次,正如另一个帖子的答案所建议的那样。@BigBen对于数组,OP刚刚在代码顶部添加了选项Base 1