Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.11.2017, 09:26   #1
ArtemSkudalov
 
Регистрация: 10.11.2017
Сообщений: 6
Печаль Голову сломал. Как определить общие элементы множества строк

Добрый день!
Прошу помощи.
Имеется база данных в excel из двух столбцов. 1й - номер строки, 2ой - содержит 30 чисел от 1 до 90. Числа в строке не повторяются.

Как определить какие 3,4,5,6... числа совпадают в максимальном количестве строк?

Пример(кол-во строк > 1000):

Строка 1: 28 39 51 72 89 5 12 23 32 67 18 45 59 76 87 8 36 42 68 90 13 24 43 53 71 15 29 34 63 77
Строка 2: 15 33 43 53 74 27 31 44 67 82 5 20 69 77 88 9 19 57 65 86 21 46 56 62 71 12 37 48 79 89
Строка 3: 2 42 64 75 83 9 14 32 61 85 13 27 31 40 59 6 29 49 79 90 7 22 35 56 81 16 41 50 63 77
Строка 4: 14 23 40 73 88 8 52 64 72 87 27 32 47 51 69 18 26 57 66 75 11 22 39 45 86 7 35 46 76 83
Строка 5: 4 11 30 78 90 7 25 43 67 85 17 45 53 60 70 16 26 38 50 71 20 31 49 61 86 6 12 54 66 79
Строка 6: 7 33 45 62 90 24 31 55 71 88 1 15 29 68 70 18 27 38 67 83 6 26 48 51 64 11 37 46 50 77
Строка 7: 18 23 34 41 90 9 15 24 50 69 6 32 60 71 85 5 10 22 56 63 1 26 39 49 83 44 58 67 75 82
Строка 8: 6 29 32 44 66 36 49 52 71 85 12 53 64 73 86 26 35 46 55 88 5 13 23 51 74 7 19 48 65 90
Строка 9: 6 28 37 50 61 4 38 51 78 80 11 26 41 67 85 2 44 59 79 90 3 16 24 32 82 30 45 53 60 74
Строка 10: 19 49 69 75 80 7 10 25 33 82 20 32 44 59 73 23 31 57 61 70 2 18 48 58 85 5 14 37 65 84
Строка 11: 4 35 40 57 60 2 11 29 42 87 13 25 37 76 86 17 46 58 67 80 28 31 41 70 84 3 15 38 54 72
Строка 12: 3 17 20 42 79 15 25 52 65 88 33 59 68 77 87 7 24 31 48 89 6 10 66 71 82 28 30 41 53 62
Строка 13: 26 31 50 60 88 15 39 40 54 65 1 29 49 73 80 2 35 66 76 86 14 28 42 58 72 9 17 32 45 85
Строка 14: 9 15 45 66 87 1 16 27 35 57 38 47 55 71 88 17 32 50 60 70 7 28 48 52 83 22 31 40 64 72
Строка 15: 6 19 32 52 86 12 22 56 66 77 7 36 45 78 84 15 25 69 70 90 9 17 30 42 57 37 53 62 75 80
Строка 16: 9 17 26 37 65 23 46 59 75 88 3 35 55 71 80 14 28 30 47 57 6 27 42 79 81 7 11 39 68 85
Строка 17: 10 20 34 54 68 11 28 39 78 80 4 47 52 60 90 14 53 69 77 81 6 15 31 56 87 22 37 40 62 76
Строка 18: 2 16 53 68 74 25 38 43 79 82 6 30 41 54 62 9 26 49 78 86 8 32 56 60 87 11 44 52 66 73
Строка 19: 3 25 33 71 80 1 21 41 51 74 12 34 59 64 85 10 24 46 60 70 8 31 58 77 86 11 38 47 66 83
Строка 20: 25 45 51 65 90 21 37 40 59 66 1 11 39 71 85 2 14 36 62 83 8 10 43 73 84 22 35 41 52 79

Можно посчитать каких чисел больше. Но нужно именно, чтоб найти совокупность из нескольких(например какие 3, или 4, или 5, или 6 числел) чисел которые входят в максимальное число строк
Вложения
Тип файла: xlsx БД1.xlsx (9.0 Кб, 12 просмотров)

Последний раз редактировалось ArtemSkudalov; 10.11.2017 в 10:28.
ArtemSkudalov вне форума Ответить с цитированием
Старый 10.11.2017, 09:54   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Первое что придумывается - словарь чисел с коллекцией номеров строк. В финале (или в процессе) выявляем максимальные коллекции.
P.S. Если числа в строках уникальны, то в словарь можно набирать строку номеров строк (в едином формате), измерять длину этой строки.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.11.2017, 10:00   #3
ArtemSkudalov
 
Регистрация: 10.11.2017
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Первое что придумывается - словарь чисел с коллекцией номеров строк. В финале (или в процессе) выявляем максимальные коллекции.
P.S. Если числа в строках уникальны, то в словарь можно набирать строку номеров строк (в едином формате), измерять длину этой строки.
Числа в строке не повторяются. А можно подробнее пожалуйста? с каким нибудь простеньким примером.
ArtemSkudalov вне форума Ответить с цитированием
Старый 10.11.2017, 10:09   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Так пример не с меня
Впрочем я его уже нашёл на планете...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.11.2017, 10:25   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Код:
Sub Perebor() 'коллекция в словаре
    Dim a, i&, t$, Dic As Object
    Dim el, col, mx&, mxs$
    
    a = Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        .CompareMode = 1
        For i = 1 To UBound(a)
        For Each el In Split(a(i, 1))
            t = el
            If Not .exists(t) Then .Add t, New Collection
            .Item(t).Add i
        Next
        Next
    End With
    
    For Each el In Dic.keys
        Select Case True
        Case mx < Dic.Item(el).Count
        mx = Dic.Item(el).Count
        mxs = ", " & el
        Case mx = Dic.Item(el).Count
        mxs = mxs & ", " & el
        End Select
    Next

MsgBox "В " & mx & " строках есть числа " & Mid(mxs, 3)
End Sub
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 10.11.2017 в 10:35.
Hugo121 вне форума Ответить с цитированием
Старый 10.11.2017, 10:34   #6
ArtemSkudalov
 
Регистрация: 10.11.2017
Сообщений: 6
По умолчанию

Спасибо! Это макрос? А в каком виде он выдаст информацию?
Можно например параметр задавать количество совокупных чисел?
И выводить эти числа и количество строк
ArtemSkudalov вне форума Ответить с цитированием
Старый 10.11.2017, 10:37   #7
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Пожалуйста.
Да, это макрос.
Чуть изменил вывод - теперь будет сообщение.
Параметр задавать в этой реализации нельзя, но думаю можно нагородить, но уже некогда...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.11.2017, 10:43   #8
ArtemSkudalov
 
Регистрация: 10.11.2017
Сообщений: 6
По умолчанию

Большое спасибо!
Начинаю изучать макросы)
ArtemSkudalov вне форума Ответить с цитированием
Старый 10.11.2017, 10:48   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Промежуточный вариант - вывод в окно отладки.
Можно всё это загрузить в массив (или например на лист), отсортировать по убыванию, взять сколько нужно первых строк.
Код:
Sub Perebor2() 'коллекция в словаре
    Dim a, i&, t$, Dic As Object, Dic2 As Object
    Dim el, col, mx&, mxs$
    
    a = Range("B1", Cells(Rows.Count, "B").End(xlUp)).Value
    Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        .CompareMode = 1
        For i = 1 To UBound(a)
        For Each el In Split(a(i, 1))
            t = el
            If Not .exists(t) Then .Add t, New Collection
            .Item(t).Add i
        Next
        Next
    End With
    
    Set Dic2 = CreateObject("Scripting.Dictionary")
    For Each el In Dic.keys
        Dic2.Item(Dic.Item(el).Count) = Dic2.Item(Dic.Item(el).Count) & ", " & el
    Next

    For Each el In Dic2.keys
      Debug.Print "В " & el & " строках есть числа " & Mid(Dic2.Item(el), 3)
    Next

End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 10.11.2017, 14:48   #10
ArtemSkudalov
 
Регистрация: 10.11.2017
Сообщений: 6
По умолчанию

Спасибо! Но к сожалению выдает не тот результат.
Взял выборку из 1000 строк.
Выдает количество каждого числа по отдельности, а не в совокупности.
То-есть нужно например:
В 900 строках находятся числа (вместе): 6, 30, 55, 70, 87
В 700 строках находятся .......

А выдает количество по отдельности.

Файл прикрепил
Изображения
Тип файла: jpg БД1.jpg (87.7 Кб, 122 просмотров)
Вложения
Тип файла: xlsx БД1.xlsx (63.3 Кб, 16 просмотров)

Последний раз редактировалось ArtemSkudalov; 10.11.2017 в 14:54.
ArtemSkudalov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вроде легко..сломал голову UnknownA Общие вопросы по Java, Java SE, Kotlin 2 24.06.2014 03:05
Форма IMAGE BMP сломал голову jin_jin Мультимедиа в Delphi 1 15.02.2013 20:29
Всю голову сломал с индексацией сайта engineer_pro PHP 4 17.08.2012 21:20
Не могу разобраться с ошибками, голову сломал Cyber Общие вопросы C/C++ 8 14.02.2011 16:40
Всю голову сломал lesha_firs Общие вопросы Delphi 6 17.06.2009 16:59