=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 包含每个独特的项目。因此,此代码还可用于获取所有唯一项目或所有重复项目。