Excel 如何根据列表框中的选择删除行?

Excel 如何根据列表框中的选择删除行?,excel,vba,Excel,Vba,我有一个Userform列表框,用于显示工作表中的数据。我想根据列表框上的选择删除工作表行 代码将根据listbox删除上面的行,而不是选定的行 Private子命令按钮3\u单击() 作为整数的Dim i 对于i=0到范围(“A65356”)。结束(xlUp)。第1行 如果选择了lstDisplay.i,则 行(i)。选择 选择。删除 如果结束 接下来我 端接头 在一些测试数据上尝试此操作。。。 子命令按钮3_单击() '将数据移动到阵列,然后移动所需数据 '到第二个数组,并将其重新粘贴到电子

我有一个Userform列表框,用于显示工作表中的数据。我想根据列表框上的选择删除工作表行

代码将根据listbox删除上面的行,而不是选定的行

Private子命令按钮3\u单击()
作为整数的Dim i
对于i=0到范围(“A65356”)。结束(xlUp)。第1行
如果选择了lstDisplay.i,则
行(i)。选择
选择。删除
如果结束
接下来我
端接头
在一些测试数据上尝试此操作。。。
子命令按钮3_单击()
'将数据移动到阵列,然后移动所需数据
'到第二个数组,并将其重新粘贴到电子表格中
'当前TestCondition是A列中的比较
'如果工作表名称不同,请更改工作表1。
Const COMPARE_COL长=1
尺寸a,重新(),nr等长,nc等长
变暗r为长,c为长,rNew为长
Dim TestCondition作为字符串,tmp
a=工作表(“表1”)。使用表格
nr=UBound(a,1)
nc=UBound(a,2)
重新编辑(1到nr,1到nc)
rNew=0
TestCondition=lstDisplay.Selected(a)
对于r=1至nr
tmp=a(r,比较列)
如果tmp测试条件,则
rNew=rNew+1
对于c=1至nc
新的(rNew,c)=a(r,c)
下一个c
TestCondition=tmp
如果结束
下一个r
工作表(“表1”)。UsedRange=重新
端接头
在一些测试数据上尝试此操作。。。
子命令按钮3_单击()
'将数据移动到阵列,然后移动所需数据
'到第二个数组,并将其重新粘贴到电子表格中
'当前TestCondition是A列中的比较
'如果工作表名称不同,请更改工作表1。
Const COMPARE_COL长=1
尺寸a,重新(),nr等长,nc等长
变暗r为长,c为长,rNew为长
Dim TestCondition作为字符串,tmp
a=工作表(“表1”)。使用表格
nr=UBound(a,1)
nc=UBound(a,2)
重新编辑(1到nr,1到nc)
rNew=0
TestCondition=lstDisplay.Selected(a)
对于r=1至nr
tmp=a(r,比较列)
如果tmp测试条件,则
rNew=rNew+1
对于c=1至nc
新的(rNew,c)=a(r,c)
下一个c
TestCondition=tmp
如果结束
下一个r
工作表(“表1”)。UsedRange=重新
端接头

从列表中删除项目时,请始终从头到尾进行操作,不要从头到尾。最重要的是,您不需要选择何时要做某事,因此我建议如下(未经测试):


顺便说一下:65356看起来很熟悉,和65536很相似(
2^16
)。我怀疑这里有一个输入错误:-)

从列表中删除项目时,始终从头到尾工作,而不是从头到尾。最重要的是,您不需要选择何时要做某事,因此我建议如下(未经测试):


顺便说一下:65356看起来很熟悉,和65536很相似(
2^16
)。我怀疑这里有输入错误:-)

使用
I+1
。。。。?另外,最好不要在循环中删除。使用
Union
创建要删除的范围,并在循环后将其删除。另外,请使用
Long
,而不是
Integer
。删除多达65k行将需要许多分钟,而Integer最多只能处理32k行,因此,如果最后一行是超出此范围的数据,则将失败。请使用
i+1
。。。。?另外,最好不要在循环中删除。使用
Union
创建要删除的范围,并在循环后将其删除。另外,请使用
Long
,而不是
Integer
。删除多达65k行将需要许多分钟,而Integer最多只能工作到32k行,因此,如果最后一行是超出此范围的数据,则将失败。非常感谢,但不幸的是,代码无法工作。你有其他想法吗?你能指定什么不起作用吗?非常感谢,但不幸的是代码不起作用。你有其他想法吗?你能具体说明什么不起作用吗?
Try this on some test data...

Sub CommandButton3_Click()

' Will move data to array and then move wanted data
' to a second array and repaste that back on to the spreadsheet
' currently TestCondition is the comparison in column A
' Change Sheet1 if your worksheet name is different.


Const COMPARE_COL As Long = 1
Dim a, aNew(), nr As Long, nc As Long
Dim r As Long, c As Long, rNew As Long
Dim TestCondition As String, tmp

a = Worksheets("Sheet1").UsedRange
nr = UBound(a, 1)
nc = UBound(a, 2)

ReDim aNew(1 To nr, 1 To nc)
rNew = 0
TestCondition = lstDisplay.Selected(a)

For r = 1 To nr
    tmp = a(r, COMPARE_COL)
    If tmp <> TestCondition Then
        rNew = rNew + 1
        For c = 1 To nc
            aNew(rNew, c) = a(r, c)
        Next c
        TestCondition = tmp
    End If
Next r

Worksheets("Sheet1").UsedRange = aNew

End Sub
For i = Range("A65356").End(xlUp).Row - 1 DownTo 1
    If lstDisplay.Selected(i) Then
        Rows(i).Delete
    End If
Step -1