Вместо стъпки 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