【问题标题】:Why does my Autofilter used to delete rows with zeros remove the headers after the fact?为什么我的自动过滤器用于删除带零的行后会删除标题?
【发布时间】:2019-05-16 19:09:33
【问题描述】:

我正在尝试删除费用为 0 的费用报告中的行,因为该信息并不重要。我正在使用自动过滤器来过滤数量列中只有零的行,并删除这些行。问题是当代码在这个任务之后继续下一步时,它使我的报表文档没有以前的标题,而这些标题非常重要。

我尝试将范围从“AB1:AB”更改为“AB2:AB”,但什么也没做,在第二个连接范围值中,我尝试将“AB”更改为“AB2”,但返回错误声明对象'_global'的“方法'范围'失败。”

Application.ScreenUpdating = False
        Range("AB1:AB" & Range("AB" & Rows.Count).End(3)(1).Row).AutoFilter 1, 0#, xlAnd, 0
            Range("AB2:AB" & Range("AB" & Rows.Count).End(3)(1).Row).SpecialCells(12).EntireRow.Delete
        ActiveSheet.AutoFilterMode = False
    Application.ScreenUpdating = True

【问题讨论】:

  • 只是为了检查 - 它们是零还是空白?
  • @BigBen 它们是零,而不是空白。我在过滤条件中有 0# 和 0,因为有时某些单元格的格式会将“0”变成“0”。
  • 在删除行之前,可以加一个Debug.Print Range("AB" & Rows.count).End(xlUp).Row吗?立即窗口中的结果是什么?
  • @BigBen 我做了,但突出显示的行是行删除行上方的行,所以是自动过滤行。我应该在该行之前执行 debug.print 并告诉你我得到了什么吗?
  • 你还有"AB2" & Rows.Count吗?如果是,请改回"AB"

标签: excel vba filter


【解决方案1】:

您遇到的问题是,如果 AB 列中没有 0,您现有的代码将过滤为仅显示标题行,然后将其删除。我添加了一些代码来循环遍历 AB 列,并在执行现有代码之前检查是否存在任何 0。

我正在编辑这个答案,它不再使用您的 AutoFilter 方法。下面的代码应该可以实现您想要实现的目标,并且它可以避免在循环中删除行的潜在问题,如 cmets 中突出显示的那样。

我已再次编辑以更正您使用包含 0(例如 10.05)的代码删除值描述的问题。

Sub Delete_Zero_Rows()

Dim Firstrow As Long
Dim Lastrow As Long
Dim Lrow As Long

With Worksheets("Sheet1")

    'Set the first and last row to loop through
    Firstrow = .UsedRange.Cells(1).Row
    Lastrow = .UsedRange.Rows(.UsedRange.Rows.Count).Row

    'Loops from Lastrow to Firstrow (bottom to top)
    For Lrow = Lastrow To Firstrow Step -1

        'Checks the values in column AB
        With .Cells(Lrow, "AB")

            If Not IsError(.Value) Then

                If .Value = "0" Then .EntireRow.Delete

            End If
        End With
      Next Lrow
    End With
End Sub

请记住将我的代码中的“Sheet1”替换为您调用的工作表。

这应该可以解决您的问题!

【讨论】:

  • 嗨,我已将您的代码集成到我自己的代码中(我所做的唯一更改是工作表名称和 LastRow 变量的名称),当我运行它时,我确保我有一行一个“0”。在文档中测试代码是否完成了它的工作。然而,代码抛出了一个错误,指出它没有找到任何符合我标准的单元格,然后就停在那里了。我们运行的报告为零是非常不寻常的,但有时它们会以某种方式进入。但是,如果每次在金额列中没有零的行时这段代码都会导致错误,那就糟糕了,哈哈。有什么建议吗?
  • 请查看我对上面的答案/代码所做的编辑。我离开了您正在使用的Autofilter,但这应该可以满足您的需要而不会出现错误/它将处理 0 或无 0 而不会出现任何问题。
  • 这对你有用吗?如果您对答案感到满意,请用绿色复选标记将其标记为合格/有效答案。干杯!
  • 看起来应该可以了。我遇到的唯一问题是,我不断收到“运行时错误 9 - 下标超出范围”,并将调试突出显示应用于将 sht1 设置为 ThisWorkbook.Worksheets("") 的行.我已将工作表名称复制并粘贴到括号中,但它仍然不断给我错误。我什至尝试创建一个可验证的 sheetName,作为我分配工作表名称的字符串。有什么想法吗?
  • 好的,它运行良好!非常感谢大家的帮助!
猜你喜欢
  • 2021-04-13
  • 1970-01-01
  • 2021-04-22
  • 2019-11-19
  • 1970-01-01
  • 2016-01-21
  • 2017-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多