vba: получите уникальные значения от массива

там создается в функциональности в vba для получения уникальных значений от одномерного массива? что относительно того, чтобы просто избавиться от дубликатов?

в противном случае затем, как я получил бы уникальные значения от массива?

46
задан pnuts 30 January 2015 в 14:02
поделиться

5 ответов

Этот пост содержит 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 
51
ответ дан 26 November 2019 в 20:14
поделиться

Я не знаю ни одной встроенной функции в VBA. Лучше всего использовать коллекцию, используя значение в качестве ключа, и добавлять к ней только в том случае, если значение не существует.

2
ответ дан 26 November 2019 в 20:14
поделиться

Нет, ничего встроенного. Сделайте это самостоятельно:

  • Создайте экземпляр объекта Scripting.Dictionary
  • Напишите цикл For по вашему массиву (обязательно используйте LBound () и UBound () вместо цикла от 0 до x!)
  • На каждой итерации проверяйте Exists () в словаре. Добавьте каждое значение массива (которое еще не существует) в качестве ключа к словарю ( используйте CStr () , поскольку ключи должны быть строками , как я только что узнал, ключи могут быть любого типа в Scripting.Dictionary ), также сохраняют само значение массива в словаре.
  • По завершении используйте Keys () (или Items () ), чтобы вернуть все значения словаря в виде нового, теперь уникального массива.
  • В моих тестах Словарь сохраняет исходный порядок всех добавленных значений, поэтому вывод будет упорядочен так же, как и ввод. Я не уверен, что это документированное и надежное поведение.
2
ответ дан 26 November 2019 в 20:14
поделиться

Нет, VBA не поддерживает эту функцию. Вы можете использовать технику добавления каждого элемента в коллекцию, используя этот элемент в качестве ключа. Поскольку коллекция не допускает дублирования ключей, результатом являются различные значения, которые при необходимости можно скопировать в массив.

Вы также можете захотеть чего-нибудь более надежного. См. Функция различных значений на http://www.cpearson.com/excel/distinctvalues.aspx

Функция отличных значений

Функция VBA, которая возвращает массив различных значений в диапазон или массив входных значений.

В Excel есть несколько ручных методов, например Расширенный фильтр для получения списка отдельные элементы из входного диапазона. Недостатком использования таких методов является что вы должны вручную обновить результаты при изменении входных данных. Причем эти методы работают только с диапазоны, а не массивы значений и, не будучи функциями, не могут быть вызваны из ячейки листа или включены в формулы массива. Эта страница описывает Функция VBA под названием DistinctValues который принимает в качестве входных данных либо диапазон или массив данных и возвращается как его результат массив, содержащий отдельные элементы из входного списка. То есть элементы со всеми дубликаты удалены. Порядок проведения элементы ввода сохранены.Приказ элементов в выходном массиве такой же, как порядок во вводе ценности. Функцию можно назвать из массива введенного диапазона на рабочий лист (см. эту страницу для информация о формулах массива), или from в формуле массива в одном ячейка листа или из другого VB функция.

1
ответ дан 26 November 2019 в 20:14
поделиться

Нет встроенных функций для удаления дубликатов из массивов. Ответ Раджа кажется элегантным, но я предпочитаю использовать словари.

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 () - это массив вариантов, а не коллекция.

39
ответ дан 26 November 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: