У меня есть 6 столбцов строк, и я ищу самую распространенную строку среди всех 6 столбцов.
Любая помощь в этом вопросе будет высоко оценена.
колонка1 | колонка2 | колонка3 | колонка4 | колонка5 | колонка6 |
---|---|---|---|---|---|
Яблоко | Апельсин | Банан | киви | Брауни | Брокколи |
Апельсин | Банан | киви | Брауни | Брокколи | |
Банан | киви | Брауни | Брокколи | ||
киви | Брауни | Брокколи | |||
Брауни | Брокколи | ||||
Брокколи |
Результатом будет Брокколи. Если бы столбец 1, строка 6 Брокколи не были там, то результатом был бы Брауни/Брокколи.
колонка1 | колонка2 | колонка3 | колонка4 | колонка5 | колонка6 |
---|---|---|---|---|---|
Маранта | Артишок | Руккола | Спаржа | Бамбуковые побеги | Бобы |
Свекла | Морковь | Сельдерей | Брауни | Брокколи | |
Банан | киви | Морковь | Чеснок | ||
Шоколадная крошка | Хлеб | Сыр | |||
Сок | Поп | ||||
Чипсы |
Результатом будет морковь.
решение1
Подойдет следующее:
=LET(Source,A2:F7,
ShortList,UNIQUE(FILTERXML("<Outer><Inner>"&SUBSTITUTE(TEXTJOIN(",",TRUE,Source),",","</Inner><Inner>")&"</Inner></Outer>","/Outer/Inner")),
Occurrences,COUNTIF(Source,ShortList),
TEXTJOIN("/",TRUE,SORT(IF(Occurrences=MAX(Occurrences),ShortList,""))))
Он использует TEXTJOIN()
для объединения всего списка, теряя пробелы. Затем FILTERXML()
трюк , чтобы превратить его в HTML и разбить на массив, который Excel распознает как таковой. UNIQUE()
затем получает список отдельных экземпляров каждого присутствующего значения.
Затем COUNTIF()
используется для получения количества для каждого уникального элемента, MAX()
получает наибольшее значение из списка этих количеств и IF()
сравнивает количество каждого уникального элемента с максимальным значением, чтобы найти квалифицированные результаты. SORT()
Располагает эти квалифицированные результаты в алфавитном порядке.
Наконец, TEXTJOIN()
берет квалифицированные результаты и форматирует их для желаемой выходной строки.
(Если сортировка нежелательна (или не нужна), просто отредактируйте эту функцию. Я предположил, что она будет желательной (решив, что строка «Брауни/Брокколи» не является непреложной, а просто быстро демонстрирует желаемый результат), и решил, что вставить ее и отредактировать будет яснее, чем не вставлять ее, просто сказать «Тогда отсортируйте» и предоставить это вам для самостоятельной работы.)
Организовано LET()
для удобства и логики. «Удобство» в том, что диапазон для работы появляется в непосредственном начале и только там, поэтому его легко редактировать. Больше ничего не меняется в настоящей версии, поэтому она переходит к промежуточным вычислениям Имена в представлении снизу вверх (возможно, лучше описать как «изнутри наружу», чтобы описать их приоритет в формуле). И, наконец, результирующая рабочая формула.
решение2
Вы также можете сделать это с помощью пользовательской функции, написанной на VBA.
Ввести этот UDF легко:
Чтобы ввести эту пользовательскую функцию (UDF),
<alt-F11>
открывает редактор Visual Basic.- Убедитесь, что ваш проект выделен в окне Project Explorer.
- Затем в верхнем меню выберите
Insert => Module
- вставьте код ниже в открывшееся окно.
Чтобы использовать эту пользовательскую функцию (UDF), введите формулу, например, =mostFrequent(A1:F6)
в ячейку.
Option Explicit
Function mostFrequent(r As Range) As Variant()
Dim arr As Variant, dict As Object
Dim v
Dim result(1)
'read range into vba array for faster processing
arr = r
Set dict = CreateObject("Scripting.Dictionary")
dict.CompareMode = TextCompare
'read into dictionary and get the count of each item
For Each v In arr
If Len(v) > 0 Then
If Not dict.Exists(v) Then
dict.Add Key:=v, Item:=1
Else
dict(v) = dict(v) + 1
End If
End If
Next v
'find max count
For Each v In dict.Keys
If dict(v) > result(1) Then
result(0) = v
result(1) = dict(v)
End If
Next v
'return most frequent string and it's count
mostFrequent = result
End Function
Алгоритм
- Считать диапазон в массив VBA для максимально быстрой обработки
- Введите каждую строку в словарь, где
- Ключ = строка
- Значение = количество строк
- Верните строку с наибольшим количеством
- В приведенном ниже коде мы фактически возвращаем массив из 2 элементов, где второй элемент — это количество элементов.
- При желании вы можете вернуть это значение, используя функцию динамического массива или функцию индекса (в зависимости от версии Excel).