这些VBA代码的错误是什么?

时间:2011-09-02 10:24:01

标签: excel vba excel-vba

我的任务是我必须删除整个行,如果K列中的值为零。我想到的第一件事是循环但我有4000行和1000行可能有K值为零。

Sub DeleteRowWithContents()
       Last = Cells(Rows.Count, "D").End(xlUp).Row
       For i = Last To 1 Step -1
           If (Cells(i, "K").Value) = 0 Then
              Cells(i, "A").EntireRow.Delete
           End If
       Next i
End Sub

我相信人们说它的时间正在进行,因为它正在循环。这就是为什么我认为更好的选择下一个方法,人们也告诉我'查找'比循环更快。所以我使用了以下代码,这是我在google搜索时发现的

Sub Delete_zeros()
    Dim rCell As Range
    Dim strAddress As String
Application.ScreenUpdating = False
ThisWorkbook.Sheets(1).Activate
    With ActiveSheet.Columns("K")
        Set rCell = .Find(What:=0, LookIn:=xlValues, SearchOrder:=xlByColumns)
        If Not rCell Is Nothing Then
            Do
            strAddress = rCell.Address
            rCell.EntireRow.Delete
            Set rCell = .FindNext(Range(strAddress))
            Loop Until rCell Is Nothing
        End If
    End With
Application.ScreenUpdating = True
End Sub

但我发现上面的代码,如果k列中有10或20个值,它也会删除该行。我的意思是如果数字包含零,则删除

例子。

    204 or 200 or 205 or 301 or 10 \ Its deleting all these rows

这些代码有什么问题?这些代码比我想要使用的循环太快但我发现了它的bug。

请解释错误的原因。如果除了循环之外K列中的值为零(或者也可能是循环过快),那么除了行更快删除行的其他方法的任何帮助?非常感谢。感谢

1 个答案:

答案 0 :(得分:4)

不是bug,在find方法中添加此参数

LookAt:= xlwhole

使用过滤器

Sub FilterAndDelete()
'Developer by Bruno Leite
'http://officevb.com 

    Dim Sht As Worksheet
    Dim FilterRange As Range
    
    'Set your Sheet
    Set Sht = ThisWorkbook.Sheets("Plan2")
    
    'Verify if is Filter
    If Sht.FilterMode Then
      Sht.ShowAllData
    End If
    
    'Filter Column A with 0 at parameter
    Sht.Range("A:A").AutoFilter Field:=1, Criteria1:="0"
    
    'Define Range Of Visible cells without row title
    Set FilterRange = Sht.Range("A1").CurrentRegion.Offset(1, 0).SpecialCells(xlCellTypeVisible)
       
    Application.DisplayAlerts = False
    
    FilterRange.Rows.Delete
    
    Application.DisplayAlerts = True
        
    Sht.ShowAllData
    
End Sub