【问题标题】:Deleteing rows without a loop meeting certain criteria删除没有满足特定条件的循环的行
【发布时间】:2013-06-18 14:09:37
【问题描述】:

我正在编写一个宏,该宏会从我使用公式找到的值中删除小于 0.75 的所有行。在另一个线程中,在这里,我发现了一个有效的循环,但这需要很长时间才能运行......所以我试图找到一种没有循环的方法。到目前为止,我的代码如下所示,但我在行上得到“运行时错误 1004,方法'对象工作表范围'失败”

ws.Range(Left(rowsToDelete, Len(rowsToDelete) - 1)).Select

有人对更正有任何想法吗?感谢所有帮助

Private Sub CommandButton6_Click()
Application.ScreenUpdating = False

Dim ws As Worksheet
Dim i&, lr&, rowsToDelete$, lookFor$, lookFor2$

'*!!!* set the condition for row deletion
lookFor = "#VALUE!"
lookFor2 = "0.75"

Set ws = ThisWorkbook.Sheets("Entry")
lr = ws.Range("H" & Rows.Count).End(xlUp).row

ReDim arr(0)

For i = 1 To lr
 If StrComp(CStr(ws.Range("H" & i).Text), lookFor, vbTextCompare) = 0 Or _
    CDbl(ws.Range("H" & i).Value) < CDbl(lookFor2) Then
    ReDim Preserve arr(UBound(arr) + 1)
    arr(UBound(arr) - 1) = i
 End If
Next i

If UBound(arr) > 0 Then
    ReDim Preserve arr(UBound(arr) - 1)
    For i = LBound(arr) To UBound(arr)
        rowsToDelete = rowsToDelete & arr(i) & ":" & arr(i) & ","
    Next i

    ws.Range(Left(rowsToDelete, Len(rowsToDelete) - 1)).Select
    Selection.Delete Shift:=xlUp

    lr = ws.Range("A" & Rows.Count).End(xlUp).row
    ws.Range(lr & ":" & lr).Select
Else
    Application.ScreenUpdating = True
    MsgBox "No more rows contain: " & lookFor & "or" & lookFor2 & ", therefore exiting"
    Exit Sub
End If

If Not Application.ScreenUpdating Then Application.ScreenUpdating = True
Set ws = Nothing
End Sub

【问题讨论】:

  • 您可以使用特殊单元格抓取任何公式错误单元格并删除一次点击中的行,然后使用自动过滤器并删除另一次点击中的 0.75 行(使用 .Text 属性很慢)

标签: excel vba


【解决方案1】:

这是一种方法:

Sub Macro1()

With Application
    .ScreenUpdating = False
    .Calculation = xlCalculationManual
    .EnableEvents = False
End With

    Dim r As Range

    Set r = Sheet1.UsedRange

    r.AutoFilter Field:=8, Criteria1:="<.75", _
        Operator:=xlAnd
    r.Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    r.AutoFilter

With Application
    .ScreenUpdating = True
    .Calculation = xlCalculationAutomatic
    .EnableEvents = True
End With

End Sub

这假设 H 列(或上面代码中的 8 列)包含您要过滤的值。您必须进行调整以适合您的床单。

【讨论】:

  • 这正确找到了我需要它找到的行,但没有删除所有行。值来自公式是否有区别?仍然有带有#Ref 的行!和#价值!剩下的。
  • @Mike Ah...我猜是#Ref!和#价值!不小于 0.75。让我摆弄我能想出的……
  • 我找到了另一个类别来过滤以解决剩余单元格的问题,因此宏可以正常工作(在 b 列中)。感谢您的帮助!
  • @Mike 我知道这有点 hack,但是否可以将您的公式包装在“IFERROR”语句(如果 2007 或更高版本)或“ISERROR”(如果早于 2007 年)中?如果这是一个错误,那么将值设置为不可能的值,例如 -9999 会被我在上面发布的自动过滤器宏捕获吗?据我所知,自动过滤器无法过滤掉错误单元格。
  • 您可以简单地使用 r.Offset(1).SpecialCells(xlCellTypeFormulas, xlErrors).EntireRow.Delete 在过滤器之前。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多