Vba 删除具有基于列的值的行
我每月有将近373000条线路。其中,零件的值较低或为空。我想把这行擦掉 我有这段代码的一部分来删除那些零的。如何以更灵活的方式创建连接空行条件(D列)的代码 谢谢Vba 删除具有基于列的值的行,vba,excel,Vba,Excel,我每月有将近373000条线路。其中,零件的值较低或为空。我想把这行擦掉 我有这段代码的一部分来删除那些零的。如何以更灵活的方式创建连接空行条件(D列)的代码 谢谢 Sub DelRowsZero() Dim i As Long For i = Cells(Rows.Count, "D").End(xlUp).Row To 2 Step -1 If Cells(i, "D") = 0 Then Rows(i).Delete Next i End
Sub DelRowsZero()
Dim i As Long
For i = Cells(Rows.Count, "D").End(xlUp).Row To 2 Step -1
If Cells(i, "D") = 0 Then Rows(i).Delete
Next i
End Sub
那么:
Sub ZeroKiller()
Dim N As Long, ToBeKilled As Range
Dim i As Long
N = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To N
If Cells(i, "D").Value = 0 Or Cells(i, "D").Value = "" Then
If ToBeKilled Is Nothing Then
Set ToBeKilled = Cells(i, "D")
Else
Set ToBeKilled = Union(ToBeKilled, Cells(i, "D"))
End If
End If
Next i
If Not ToBeKilled Is Nothing Then
ToBeKilled.EntireRow.Delete
End If
End Sub
这假设A是最长的列。如果情况并非总是如此,请使用:
N = Range("A1").CurrentRegion.Rows.Count
那么:
Sub ZeroKiller()
Dim N As Long, ToBeKilled As Range
Dim i As Long
N = Cells(Rows.Count, "A").End(xlUp).Row
For i = 1 To N
If Cells(i, "D").Value = 0 Or Cells(i, "D").Value = "" Then
If ToBeKilled Is Nothing Then
Set ToBeKilled = Cells(i, "D")
Else
Set ToBeKilled = Union(ToBeKilled, Cells(i, "D"))
End If
End If
Next i
If Not ToBeKilled Is Nothing Then
ToBeKilled.EntireRow.Delete
End If
End Sub
这假设A是最长的列。如果情况并非总是如此,请使用:
N = Range("A1").CurrentRegion.Rows.Count
我担心375K线路,谁知道这条线路需要多长时间才能运行
Sub Button1_Click()
Dim i As Long
For i = Cells(Rows.Count, "D").End(xlUp).Row To 2 Step -1
If Cells(i, "D") = 0 Or Cells(i, "D") = "" Then
Rows(i).Delete
End If
Next i
End Sub
我很想知道这是否适用于其他人,它只是使用“替换”0个值到空白处,然后使用特殊的单元格删除空白行。我对38K行的测试需要3秒钟
Sub FindLoop()
Dim startTime As Single
startTime = Timer
'--------------------------
Columns("D:D").Replace What:="0", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Columns("D:D").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
'---------------------------------
Debug.Print Timer - startTime
End Sub
我担心375K线路,谁知道这条线路需要多长时间才能运行
Sub Button1_Click()
Dim i As Long
For i = Cells(Rows.Count, "D").End(xlUp).Row To 2 Step -1
If Cells(i, "D") = 0 Or Cells(i, "D") = "" Then
Rows(i).Delete
End If
Next i
End Sub
我很想知道这是否适用于其他人,它只是使用“替换”0个值到空白处,然后使用特殊的单元格删除空白行。我对38K行的测试需要3秒钟
Sub FindLoop()
Dim startTime As Single
startTime = Timer
'--------------------------
Columns("D:D").Replace What:="0", Replacement:="", LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=True, SearchFormat:=False, _
ReplaceFormat:=False
Columns("D:D").SpecialCells(xlCellTypeBlanks).EntireRow.Delete
'---------------------------------
Debug.Print Timer - startTime
End Sub
,即在找到行时删除行要比一次删除所有行快
因此,我在A列和B列中运行了36000行=randbween(0,10)
(然后复制+粘贴特殊值/值),并在32秒内完成了三次
取消对currentValue
赋值的注释并用currentValue
比较替换数组下标访问会增加2.5秒的开销;取消对iError
检查的注释会增加额外的3.5秒开销-但是如果检查的单元格有一点点可能包含一些#REF代码>或值代码>错误
每次我运行它,大约4000行最终被删除
注:
- 没有隐式
ActiveSheet
引用。该代码针对Sheet2
,这是工作表(“Sheet2”)
的代码名-一个全局范围的工作表
对象变量,您可以在编译时免费获得该变量。如果运行此操作的工作表在编译时存在,请使用其代码名(即属性工具窗口/F4中的(名称)
属性)
- 范围是硬编码的。您已经知道如何获取包含数据的最后一行,因此我不必为此费心。尽管如此,您还是希望将工作范围转储到变体数组中
- 如果所涉及的任何单元格都不可能包含工作表错误值,则可以忽略/删除注释掉的代码
当然,375K行的运行时间将比32-38秒长得多,但我想不出更快的解决方案。,找到行时删除行要比一次删除所有行更快
因此,我在A列和B列中运行了36000行=randbween(0,10)
(然后复制+粘贴特殊值/值),并在32秒内完成了三次
取消对currentValue
赋值的注释并用currentValue
比较替换数组下标访问会增加2.5秒的开销;取消对iError
检查的注释会增加额外的3.5秒开销-但是如果检查的单元格有一点点可能包含一些#REF代码>或值代码>错误
每次我运行它,大约4000行最终被删除
注:
- 没有隐式
ActiveSheet
引用。该代码针对Sheet2
,这是工作表(“Sheet2”)
的代码名-一个全局范围的工作表
对象变量,您可以在编译时免费获得该变量。如果运行此操作的工作表在编译时存在,请使用其代码名(即属性工具窗口/F4中的(名称)
属性)
- 范围是硬编码的。您已经知道如何获取包含数据的最后一行,因此我不必为此费心。尽管如此,您还是希望将工作范围转储到变体数组中
- 如果所涉及的任何单元格都不可能包含工作表错误值,则可以忽略/删除注释掉的代码
当然,375K行的运行时间将远远超过32-38秒,但我想不出更快的解决方案。可能重复@ashleedawg,我不认为这是重复的问题@user1914644您应该包括一些附加的“空行条件”。这些“空行条件”是否始终相同?还是从某个地方的牢房里读出来的?我的第一个想法是在If
语句中简单地使用OR来测试头值是否为0,或者是否为,等等。嗨!“空行条件”是D列(标题值)中的条件,如果其值为0或为空,则该行将被删除。您的示例在D列中显示“1,0”也是条件吗?如果单元格包含一个“0”如果单元格(i,“D”)=0或单元格(i,“D”)=”,则行(i)。删除“/code>”?可能重复@ashleedawg,我不认为这是该问题的重复@user1914644您应该包括一些附加的“空行条件”。这些“空行条件”是否始终相同?还是从某个地方的牢房里读出来的?我的第一个想法是在If
语句中简单地使用OR来测试头值是否为0,或者是否为,等等。嗨!“空行条件”是D列(标题值)中的条件,如果其值为0或为空,则该行将被删除。您的示例在D列中显示“1,0”也是条件吗?如果单元格包含一个“0”如果单元格(i,“D”)=0或单元格(i,“D”)=0,则行(i)。删除长的。很长。请参阅以获得[更]高效的解决方案。唯一的区别是,它能快多少