Вместо шагов 2 и 3, возможно, вы могли бы использовать Scripting.Dictionary
и добавлять каждое значение в словарь. Любые повторяющиеся записи вызовут ошибку времени выполнения, которую можно либо перехватить, либо проигнорировать (resume next
). Наконец, вы можете просто вернуть словарь count
, который даст вам количество уникальных записей.
Вот кусок кода, который я наспех собрал:
Function UniqueEntryCount(SourceRange As Range) As Long
Dim MyDataset As Variant
Dim dic As Scripting.Dictionary
Set dic = New Scripting.Dictionary
MyDataset = SourceRange
On Error Resume Next
Dim i As Long
For i = 1 To UBound(MyDataset, 1)
dic.Add MyDataset(i, 1), ""
Next i
On Error GoTo 0
UniqueEntryCount = dic.Count
Set dic = Nothing
End Function
Я знаю, что resume next
можно считать «запахом кода», но альтернативой может быть использование функции exists
словаря, чтобы проверить, существует ли уже указанный ключ, а затем добавить значение, если это не так. У меня просто есть ощущение, что когда я делал подобное в прошлом, было быстрее просто игнорировать любые ошибки, возникающие для дубликатов ключей, а не использовать exists
YMMY. Для полноты картины вот еще один метод, использующий exists
:
Function UniqueEntryCount(SourceRange As Range) As Long
Dim MyDataset As Variant
Dim dic As Scripting.Dictionary
Set dic = New Scripting.Dictionary
MyDataset = SourceRange
Dim i As Long
For i = 1 To UBound(MyDataset, 1)
if not dic.Exists(MyDataset(i,1)) then dic.Add MyDataset(i, 1), ""
Next i
UniqueEntryCount = dic.Count
Set dic = Nothing
End Function
Хотя приведенный выше код проще, чем предложенный вами метод, было бы целесообразно проверить его производительность в сравнении с вашим решением.
person
i_saw_drones
schedule
01.08.2012