2015-09-16 3 views
-1

Учитывая какой-то набор значений (массив или коллекция какого-то рода), как я могу сгенерировать набор различных значений?Как я могу получить уникальный набор значений?

+1

возможно дубликат [Извлечение коллекцию уникальных значений из фильтр в VBA] (http://stackoverflow.com/questions/31891059/extracting-the-collection-of-unique-values-from-a-filter-in-vba) – Jeeped

+0

@Jeeped Предназначен для отображения общего без смешивания в Excel- или другом коде, специфичном для хоста. –

+0

Да, я точно понимаю, чего вы пытаетесь достичь. Просто так много Scripting. Словарь литературы уже доступен. Я задаюсь вопросом, нужна ли нам не-Community-Wiki ответ на свой вопрос. Возможно, вам следует зарегистрироваться для новых [Warlords of Documentation] (http://meta.stackoverflow.com/questions/306213/warlords-of-documentation-your-questions-answered?cb=1) усилий. У меня есть. – Jeeped

ответ

1

Используйте Scripting.Dictionary (Инструменты ->Список использованной литературы ... ->Microsoft Scripting среды выполнения):

Function Unique(values As Variant) As Variant() 
    'Put all the values as keys into a dictionary 
    Dim dict As New Dictionary 
    Dim val As Variant 
    For Each val In values 
     dict(val) = 1 
    Next 
    Unique = dict.Keys 'This cannot be done with a Collection, which doesn't expose its keys 
End Function 

В VBScript, или VBA, если вы предпочитаете использовать позднее связывание (переменные без явные типы):

Function Unique(values) 
    Dim dict, val 
    Set dict = CreateObject("Scripting.Dictionary") 
    For Each val In values 
    ... 

Если работает VBA на Mac (который не имеет Microsoft Scripting Runtime), есть drop-in replacement for Dictionary.

Некоторые примеры:


Другой вариант (только VBA) является использование Collection. Это немного неудобно, потому что нет никакого способа установить существующий ключ без ошибки броска, и потому, что возвращаемый массив должен быть создан вручную:

Function Unique(values As Variant) As Variant() 
    Dim col As New Collection, val As Variant, i As Integer 
    For Each val In values 
     TryAdd col, val, val 
    Next 
    Dim ret() As Variant 
    Redim ret(col.Count - 1) 
    For i = 0 To col.Count-1 
     ret(i) = col(i+1) 
    Next 
    Unique = ret 
End Function 

Sub TryAdd(col As Collection, item As Variant, key As String) 
    On Error Resume Next 
    col.Add(item, key) 
End Sub 
Смежные вопросы