Zamiast kroków 2 i 3, być może warto użyć wartości Scripting.Dictionary
i dodać każdą wartość do słownika. Wszelkie duplikaty wpisów powodowałyby błąd runtime, który można albo przechwycić, albo zignorować (resume next
). Na koniec możesz po prostu zwrócić słownik count
, który da ci liczbę unikalnych wpisów.
Oto kawałek kodu I pośpiesznie wyrzucił razem:
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
wiem, że resume next
można uznać za „zapachy kodu”, ale alternatywą może być użycie funkcji exists
słownika, aby sprawdzić, czy określony klucz już istnieje, a następnie dodaje wartość, jeśli nie. Po prostu mam wrażenie, że kiedy robiłem coś podobnego w przeszłości, to było tak, że po prostu zignorowałem wszystkie błędy wywołane dla duplikatów kluczy, zamiast używać exists
YMMY. Dla kompletności, tutaj jest inna metoda z użyciem 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
Chociaż powyższy kod jest prostszy niż proponowanej metody, warto byłoby, aby przetestować działanie przeciwko nim rozwiązania.
Możesz załadować zakres na tablicę 2D, a następnie ją pętli i użyć słownika skryptów do sprawdzenia unikalności. Słownik skończy się, gdy skończysz. –
@TimWilliams pokonałeś mnie, dokładnie moja myśl :) –
Trzy odpowiedzi - miło Sprawdzę je i wybiorę w piątek. Dzięki – Qbik