Excel 从listbox用户表单中删除行

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

我有一个显示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 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