我有一个有趣的问题。我试过搜索这个网站和谷歌,但只有一些相关的问题,没有一个实际上解决了这个特定的需求。
我有一个包含10列的电子表格(让我们称之为A-J
)。我需要删除列H中单元格中没有值"30", "60", "90", "120"
或空白的所有行。
虽然有很多方法可以做到这一点,但是所有这些都依赖于循环,这对我来说不起作用,因为这个数据集有超过25k行,运行时间超过10分钟 - 太长了。
我一直在研究与.Find
函数一起使用的autofilter选项(例如,查找不符合条件且删除的H单元格的所有行)但2003年的AutoFilter
仅适用于2个标准,而我有5个要检查。我不知道该怎么办。
感谢任何帮助。
答案 0 :(得分:2)
这删除了20秒内25k行样本中所有匹配的行(~10%)
Sub tt()
Dim rw As Range
Dim all As Range
Dim t
Dim b As Boolean
t = Timer
For Each rw In Range("A1").CurrentRegion.Rows
If rw.Cells(8).Value < 1 Then
If b Then
Set all = Application.Union(rw, all)
Else
Set all = rw
b = True
End If
End If
Next rw
If not all is nothing then all.EntireRow.Delete
Debug.Print "elapsed: " & Timer - t
End Sub
答案 1 :(得分:0)
您可以尝试“高级过滤”选项,您可以在其中指定两个以上的条件来过滤列表。过滤与您设置的条件匹配的列表后,可以将已过滤的列表复制到另一个位置(可用选项),然后删除剩余的列表。
答案 2 :(得分:0)
您可以添加具有您自己条件的列:
=IF(OR(H1=30;H1=60;H1=90;H1=120;H1="");"DELETE";"")
(对于第1行给出公式,您必须将其复制粘贴到整个范围)
然后使用过滤和排序来选择要删除的行。
答案 3 :(得分:0)
一些速度提示:
说明这一点,我会使用这段代码:
Sub Macro1()
Dim su As Boolean, cm As XlCalculation
Dim r As Long, v(), r_offset As Long
su = Application.ScreenUpdating
Application.ScreenUpdating = False 'Disable screen updating
cm = Application.Calculation
Application.Calculation = xlCalculationManual 'Disable automatic calculation
'Only use used values
With Intersect(Range("H:H"), Range("H:H").Worksheet.UsedRange)
v = .Value 'Assign values to array
r_offset = .Row - LBound(v) 'Mapping between array first index and worksheet row number
End With
'Check all row from bottom (so don't need to deal with row number changes after deletion)
For r = UBound(v) To LBound(v) Step -1
Select Case v(r, 1)
Case "30", "60", "90", "120", Empty 'Do nothing
Case Else
Sheet1.Rows(r + r_offset).EntireRow.Delete
End Select
Next
Application.ScreenUpdating = su 'Restore screen updating
Application.Calculation = cm 'Restore calculation mode
End Sub
答案 4 :(得分:0)
感谢所有建议解决方案的人。在这段时间之内,我最终找到了在<1秒内完成此操作的方法 - 显然我自己没有意识到AutoFilter
可以支持比较标准(大于,小于等)。
使用我自行过滤的一系列自动过滤器,然后删除过滤为“&lt; 30”,“30120”的所有行。
不优雅,但它确实有效。