=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. Имеется 2 раза A2
в качестве дубликата.
Как видите, функция содержит гораздо больше информации, чем только количество дубликатов. oDuplicatesCollection
содержит каждый дубликат элемента. oUniqueCollection
содержит каждый уникальный элемент. Таким образом, этот код также может быть использован для получения всех уникальных предметов или всех повторяющихся предметов.