如何删除包含重复项的行而不循环?

时间:2019-07-23 21:04:25

标签: excel vba excel-formula

我需要完成一些复杂的操作;我需要连续检查某个值,说出“ Special”一词,然后从原始工作表中“剪切”整行,并按特定顺序粘贴。但是,我还需要检查此工作表中是否有重复项,并删除原始行和重复项行;看来,这两个操作都需要循环才能检查工作表中整列的值,这些值可能有250多个值高,最终结果确实很慢。

因此,简而言之,如何在不使用循环的情况下检查这些值并对它们执行所需的操作?我知道这里有一个excel FIND()函数,但是在实现该功能以记下重复值时遇到了麻烦。

1 个答案:

答案 0 :(得分:0)

我知道您希望避免循环,但是此方法应该快速(特别是对于仅针对250行运行的情况)

您将使用rng.Find()循环搜索范围内的每个单元格。诀窍是要照看方法中当前单元格的范围,然后将cel的地址与.Find()的地址进行比较。如果地址匹配,则没有重复。但是,如果地址不同,那么您就会知道该范围内的某个地方还有另一个值。

您将所有重复对象放置在一个范围对象中,以后将在一次扫描中将其全部删除。

您未能提供当前代码,因此我假设您使用的是工作表索引(1)和A列。如果其中任何一个都不正确,那么您将需要进行一些小的调整。 / p>

Sub RemoveAllDupes()

    Dim ws As Worksheet, rng As Range
    Set ws = ThisWorkbook.Worksheets(1)
    Set rng = ws.Range("A1:A" & lastRow(ws))

    Dim delRng As Range, cel As Range, tRng As Range
    For Each cel In rng.Cells
        Set tRng = rng.Find(cel.Value, cel, xlValues, xlWhole)
        If tRng.Address <> cel.Address Then
            If delRng Is Nothing Then
                Set delRng = Union(cel, tRng)
            Else
                Set delRng = Union(delRng, cel, tRng)
            End If
        End If
        Set tRng = Nothing
    Next cel

    If Not delRng Is Nothing Then delRng.EntireRow.Delete

End Sub

Function lastRow(ws As Worksheet, Optional col As Variant = 1) As Long
    lastRow = ws.Cells(ws.Rows.Count, col).End(xlUp).Row
End Function

如您所见,我们Union()既有cel(这是循环的当前单元格)又有tRng(这是备用单元格)。这样可以确保删除delRng时,原始目标和重复目标都被删除。

由于我们要遍历整个范围并始终向前看,因此不必一次查找所有重复对象的实例(尽管这样可能会略微提高忽略已检查单元格的效率)< / em>。