Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 删除具有基于列的值的行_Vba_Excel - Fatal编程技术网

Vba 删除具有基于列的值的行

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

我每月有将近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

那么:

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)。删除长的。很长。请参阅以获得[更]高效的解决方案。唯一的区别是,它能快多少