excel vba自动过滤范围并删除co​​l D中所有带0的行

Posted

技术标签:

【中文标题】excel vba自动过滤范围并删除co​​l D中所有带0的行【英文标题】:excel vba autofilter range and delete all rows with 0 in col D 【发布时间】:2015-12-26 04:00:42 【问题描述】:

我有一长串数据(产品标签),另一张表有原始数据和计算。我有一个宏可以导入 A2 - AP2 中的数据。它扫描 Col D 并删除 col D 中具有零 (0) 值的任何行。我让它工作但是,有没有办法改变代码只删除从 A 到 AP 的行?我有 3 个其他代码需要这个,但由于其他数据/帮助列,我不能只删除一整行?

Worksheets("Labels").Activate
 ActiveSheet.AutoFilterMode = False

 ActiveSheet.Range(drop2).AutoFilter Field:=4, Criteria1:="=-", _
        Operator:=xlOr, Criteria2:="=+"

    Dim oRow As Range, rng As Range
    Dim myRows As Range
    With Sheets("Labels")
        Set myRows = Intersect(.Range("D:D").EntireRow, .UsedRange)
        If myRows Is Nothing Then Exit Sub
    End With

    For Each oRow In myRows.Columns(1).Cells
        If oRow.EntireRow.Hidden Then
            If rng Is Nothing Then
                Set rng = oRow
            Else
                Set rng = Union(rng, oRow)
            End If
        End If
    Next

    If Not rng Is Nothing Then rng.EntireRow.Delete

 ActiveSheet.AutoFilterMode = False
 Application.ScreenUpdating = True

【问题讨论】:

Intersect.SpecialCells(xlCellTypeVisible) 一起使用,如图所示Here 仅适用于过滤范围:) 我会试一试 Siddharth,我的大部分代码(包括相交)来自谷歌搜索和另一个论坛。老实说,我不是 100% 确定代码在做什么,但它在大多数情况下确实有效。 【参考方案1】:

如果没有看到您的 Excel 数据,我无法猜测您在代码中做了什么。但是,根据您的解释,您将查看 D 列,如果找到 0,那么您将删除整行。但是,您不想删除整行,因为这会删除辅助列。我只是想重复你说的话。如果这是您想要的,请使用带有 Shift:=xlUp

的范围删除函数调用
Range("A2:AP2").Delete Shift:=xlUp

这不会删除整行,只会删除 A2:AP2 中的数据并将下面的所有单元格上移。有点删除你的整行,让你的帮助列保持不变。

更新 1:

我将尝试用一个小例子来解释它。下面的屏幕截图显示了我正在使用的示例数据,

黄色标记的单元格的值为零,除辅助列数据外,需要清除整行。下面是这个excel数据的示例代码,

Dim i As Integer
Dim myRows As Range

Set myRows = Intersect(Sheet1.Range("A:E").EntireRow, Sheet1.UsedRange)
If myRows Is Nothing Then Exit Sub

For i = 1 To myRows.Rows.Count
    If Sheet1.Cells(i, 4) = 0 Then
        Sheet1.Range("A" & CStr(i) & ":E" & CStr(i)).Delete (xlUp)
    End If
Next

如果上面的代码被执行,下面是结果的截图。请注意,D 列中值为 0 的整行已被删除,而 Helper 列不受影响。

【讨论】:

它不会总是在第 2 行,因为它会从第 2 行扫描到 X(通常小于 5000)。我是否应该将当前行设置为变量 ex Range("A2:AP2").Delete Shift:=xlUp 将变暗 rd as string dr = activecell.row Range("A" & rdel &":AP" & rdel).删除 Shift:=xlUp 是的。这是我试图举的一个例子。肯定你将不得不动态地使用它。 “如果不是 rng 什么都不是,那么 rng.EntireRow.Delete” - 这在您的代码中,您可能需要调用 rng.Delete Shift:xlUp。类似的东西。 Dim rdel As String If Not rng Is Nothing Then Range("A" & rdel & ":AP" & rdel).Delete shift:=xlUp 删除了我所有的数据,还好我在尝试之前保存了一个版本。我猜我编码错误。 很好,你得到了它的副本。始终在单独的副本中测试代码,保留原始保险箱。我已经用示例和屏幕截图更新了答案。请检查它是否可以帮助您解决问题。 没错,如果你想插入一行调用.insert。例如:Sheet1.Range("A2:E2").Insert(xlDown) 将在第二行从 A 插入一行单元格到 E。

以上是关于excel vba自动过滤范围并删除co​​l D中所有带0的行的主要内容,如果未能解决你的问题,请参考以下文章

Excel VBA自动筛选器会继续删除与条件不匹配的数据

IF & Statement 从 excel 到 VBA

使用 Excel VBA 损坏文件删除命名范围

Excel VBA 自动过滤器然后更改字段值并填写错误处理空白单元格的可能性

Excel VBA:如果在范围内找不到值,请转到

VBA Excel 2010 - 自动填充不填充