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