我需要完成一些复杂的操作;我需要连续检查某个值,说出“ Special”一词,然后从原始工作表中“剪切”整行,并按特定顺序粘贴。但是,我还需要检查此工作表中是否有重复项,并删除原始行和重复项行;看来,这两个操作都需要循环才能检查工作表中整列的值,这些值可能有250多个值高,最终结果确实很慢。
因此,简而言之,如何在不使用循环的情况下检查这些值并对它们执行所需的操作?我知道这里有一个excel FIND()函数,但是在实现该功能以记下重复值时遇到了麻烦。
答案 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>。