程序代码正在删除我想要保留的数据

时间:2016-06-29 09:46:26

标签: excel vba excel-vba

我有一个宏来合并另一个工作表上的值,并且基于这些值,它必须返回第一个工作表并删除。但宏正在删除我想保留的内容。

The sheet

The Macro:
Sub DeleteOthers()
    Dim r1 As Range, c As Range
    Dim t As String

    With Sheets("Sheet2")
        Set r1 = .Range(.Cells(2, "H"), .Cells(Rows.Count, "H").End(xlUp))
    End With

    For Each c In r1
        If c.Text = "<<<Keep Row" Then
            Sheets("Sheet1").Select
            t = c.Offset(0, -1)
            Rows(t).ClearContents
        End If
    Next
End Sub

2 个答案:

答案 0 :(得分:0)

更改为:

If c.Text <> "<<<Keep Row" Then

答案 1 :(得分:0)

@ Vityata的答案正确解决了问题的核心 - 使用<>代替=是主要问题。

(使用@ arcadeprecinct推荐的c.Value代替c.Text也是一个好主意。)

如果你要在Excel中手动解决这个问题,你可能不会逐行进行 - 对吗?您将使用Excel的内置过滤...并且使用VBA,您可以使用Range对象内置的AutoFilter方法快速获得相同的精彩结果。

Option Explicit
Sub DeleteOthersWithAutoFilter()
    Dim r1 As Range, c As Range

    'Grab the full data range, not just column H
    With Sheets("Sheet2")
        Set r1 = .Range(.Cells(1, 1), .Cells(Rows.Count, "N").End(xlUp))
    End With

    With r1

        'Apply the Autofilter method to column H in the range
        'identifying any cells NOT containing "<<<Keep Row"
        .AutoFilter Field:=8, _
                    Criteria1:="<><<<Keep Row"

        'Clear the remaining, visible rows while keeping the headers
        Set c = .Offset(1, 0).Resize(.Rows.Count - 1).SpecialCells(xlCellTypeVisible)
        c.ClearContents

    End With

    'Clear the filter
    Sheets("Sheet2").AutoFilterMode = False

End Sub

使用Range.AutoFilter代替循环遍历各行可能会非常快,尤其是当您的数据集变大时。

您可以在此处详细了解两种策略之间的差异,循环遍历行和Range.AutoFilter

https://danwagner.co/how-to-delete-rows-with-range-autofilter/

其中包括每个操作中的YouTube视频基准测试。