我有一个宏来合并另一个工作表上的值,并且基于这些值,它必须返回第一个工作表并删除。但宏正在删除我想保留的内容。
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
答案 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视频基准测试。