там создается в функциональности в vba для получения уникальных значений от одномерного массива? что относительно того, чтобы просто избавиться от дубликатов?
в противном случае затем, как я получил бы уникальные значения от массива?
Этот пост содержит 2 примера. Мне нравится второй:
Sub unique()
Dim arr As New Collection, a
Dim aFirstArray() As Variant
Dim i As Long
aFirstArray() = Array("Banana", "Apple", "Orange", "Tomato", "Apple", _
"Lemon", "Lime", "Lime", "Apple")
On Error Resume Next
For Each a In aFirstArray
arr.Add a, a
Next
For i = 1 To arr.Count
Cells(i, 1) = arr(i)
Next
End Sub
Я не знаю ни одной встроенной функции в VBA. Лучше всего использовать коллекцию, используя значение в качестве ключа, и добавлять к ней только в том случае, если значение не существует.
Нет, ничего встроенного. Сделайте это самостоятельно:
Scripting.Dictionary
For
по вашему массиву (обязательно используйте LBound ()
и UBound ()
вместо цикла от 0 до x!) Exists ()
в словаре. Добавьте каждое значение массива (которое еще не существует) в качестве ключа к словарю ( CStr ()
, поскольку ключи должны быть строками Scripting.Dictionary
), также сохраняют само значение массива в словаре. Keys ()
(или Items ()
), чтобы вернуть все значения словаря в виде нового, теперь уникального массива. Нет, VBA не поддерживает эту функцию. Вы можете использовать технику добавления каждого элемента в коллекцию, используя этот элемент в качестве ключа. Поскольку коллекция не допускает дублирования ключей, результатом являются различные значения, которые при необходимости можно скопировать в массив.
Вы также можете захотеть чего-нибудь более надежного. См. Функция различных значений на http://www.cpearson.com/excel/distinctvalues.aspx
Функция отличных значений
Функция VBA, которая возвращает массив различных значений в диапазон или массив входных значений.
В Excel есть несколько ручных методов, например Расширенный фильтр для получения списка отдельные элементы из входного диапазона. Недостатком использования таких методов является что вы должны вручную обновить результаты при изменении входных данных. Причем эти методы работают только с диапазоны, а не массивы значений и, не будучи функциями, не могут быть вызваны из ячейки листа или включены в формулы массива. Эта страница описывает Функция VBA под названием DistinctValues который принимает в качестве входных данных либо диапазон или массив данных и возвращается как его результат массив, содержащий отдельные элементы из входного списка. То есть элементы со всеми дубликаты удалены. Порядок проведения элементы ввода сохранены.Приказ элементов в выходном массиве такой же, как порядок во вводе ценности. Функцию можно назвать из массива введенного диапазона на рабочий лист (см. эту страницу для информация о формулах массива), или from в формуле массива в одном ячейка листа или из другого VB функция.
Нет встроенных функций для удаления дубликатов из массивов. Ответ Раджа кажется элегантным, но я предпочитаю использовать словари.
Dim d As Object
Set d = CreateObject("Scripting.Dictionary")
'Set d = New Scripting.Dictionary
Dim i As Long
For i = LBound(myArray) To UBound(myArray)
d(myArray(i)) = 1
Next i
Dim v As Variant
For Each v In d.Keys()
'd.Keys() is a Variant array of the unique values in myArray.
'v will iterate through each of them.
Next v
РЕДАКТИРОВАТЬ: Я изменил цикл, чтобы использовать LBound
и UBound
в соответствии с предложенным ответом Томалака.
РЕДАКТИРОВАТЬ: d.Keys ()
- это массив вариантов, а не коллекция.