实际上,我已经有了部分答案!!!使用“单元格值为”->“重复”的条件格式! 这样,可以“实时”检查每个用户的新条目。
我需要检查列的30000行中是否存在重复的条目(任何值,但不包含空格!)。我想跟踪填充过程中有多少重复项。
好的,条件格式化是一种非常有效的视觉指示,可以满足我的需求,但是由于我无法执行循环来检查单元格的颜色(发现有人反对这种方法! !)我需要找到一种计算重复次数的替代方法(总体而言,无需确定每种情况下的重复次数!)。
我尝试了公式:
= SUMPRODUCT((COUNTIF(F2:F30001; $ F $ 2:$ F $ 30001)> 1))
可以,但是要花两分钟。
如果您想复制我的案子。我的30000个条目的格式为:字母“ A”,以及介于100000和999999之间的数字,例如A354125,A214547等。将文本“ = CONCATENATE(” A“; RANDBETWEEN(100000; 999999))”复制为文本以保存时间。
谢谢!
PS:有人知道用于条件格式查找重复项的算法吗(很快)?
宏解决方案不是最好的,但是可以接受的! ;)
答案 0 :(得分:0)
=SUMPRODUCT((COUNTIF(F2:F30001;$F$2:$F$30001)>1))
必须执行以下操作:计算$F$2
是否在F2:F30001
中,然后计数$F$3
是否在F2:F30001
中,...,然后计数如果$F$30001
在F2:F30001
中。因此,它必须与每个单独项完全遍历数组F2:F30001
。
对数组中重复项进行计数的最快方法是避免每个项目都完全循环遍历该数组。一种方法是先排序。有非常快速的快速排序方法。或使用按定义只能包含唯一项的集合。
以下代码使用第二种方法。 Collection
的键必须唯一。添加具有重复密钥的项目失败。
Public Function countDuplicates(vArray As Variant, Optional inclusive As Boolean ) As Variant
On Error Goto wrong
If IsMissing(inclusive) Then inclusive = False
oDuplicatesCollection = new Collection
oUniqueCollection = new Collection
lCountAll = 0
For Each vValue In vArray
If contains(oUniqueCollection, CStr(vValue)) Then
On Error Resume Next
oDuplicatesCollection.Add 42, CStr(vValue)
On Error Goto 0
Else
oUniqueCollection.Add 42, CStr(vValue)
End If
lCountAll = lCountAll + 1
Next
countDuplicates = lCountAll - oUniqueCollection.Count + IIF(inclusive, oDuplicatesCollection.Count, 0)
Exit Function
wrong:
'xray vArray
countDuplicates = CVErr(123)
End Function
Function contains(oCollection As Collection, sKey As String)
On Error Goto notContains
oCollection.Item(sKey)
contains = True
Exit Function
notContains:
contains = False
End Function
该函数可以调用:
=COUNTDUPLICATES(F2:F30001, TRUE())
这应该返回与您相同的结果
=SUMPRODUCT((COUNTIF(F2:F30001,$F$2:$F$30001)>1))
可选的第二个参数inclusive
表示计数包括多次出现的所有值。例如,{A1, A2, A2, A2, A3}
包含3次A2
。包含在内的计数表示计数结果将为3。不包含在内的计数表示计数结果将为2。A2
有2次重复。
如您所见,该函数包含的信息远远超过重复项的计数。 oDuplicatesCollection
包含每个重复的项目。 oUniqueCollection
包含每个唯一项。因此,此代码还可用于获取所有唯一项或所有重复项。