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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2013, 22:00   #1
Macjus
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 4
По умолчанию поиск совпадений по 3 и более стобцам

Добрый!
Прошу помощи у профи.
Есть 5 столбцов в которых могут быть аналогичные данные.
Задачка состоит в том, что бы эти данные найти.
Данных много (>10000 строк) поэтому красить долго.
Идеально перенести на новый лист, те которые совпали во всех 5 столбцах.
Код макроса будет приравнен к спасению человечества!
Вложения
Тип файла: zip my_compare.xlsx.zip (7.3 Кб, 15 просмотров)
Macjus вне форума Ответить с цитированием
Старый 25.08.2013, 23:04   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Плохой пример - нет совпадений. Но несложно их конечно внести.
Код:
Option Explicit

Sub tt()
    Dim a(), i&, ii&, t As String * 5, tt$, k

    With CreateObject("scripting.dictionary")
        a = [a1].CurrentRegion.Value
        For i = 1 To UBound(a)
            For ii = 1 To UBound(a, 2)
                If Len(Trim(a(i, ii))) Then
                    If Not .exists(a(i, ii)) Then
                        tt = t
                        Mid(tt, ii, 1) = 1
                        .Item(a(i, ii)) = tt
                    Else
                        tt = .Item(a(i, ii))
                        Mid(tt, ii, 1) = 1
                        .Item(a(i, ii)) = tt
                    End If
                End If
            Next ii, i

            i = 0
            For Each k In .keys
                If .Item(k) = "11111" Then _
                   i = i + 1: a(i, 1) = k
            Next

            If i > 0 Then
                Workbooks.Add(1).Sheets(1).[a1].Resize(i, 1) = a
            Else
                MsgBox "Нет результата!", vbCritical
            End If
        End With
    End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 25.08.2013, 23:55   #3
Czeslaw
Пользователь
 
Регистрация: 08.07.2013
Сообщений: 95
По умолчанию

Раскрасить очень просто,только некоторые данные у Вас и в столбцах повторяются.
Вложения
Тип файла: rar my_compare.rar (7.3 Кб, 23 просмотров)
Czeslaw вне форума Ответить с цитированием
Старый 26.08.2013, 00:00   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Можно и в моём коде раскраску добавить - просто ещё раз проходим по массиву, уже только анализируем item, если "11111", то по позиции в массиве определяем ячейку и красим.
Только действительно зачем? Как их в такой куче искать? Если нужно, то можно и номера строк тоже собрать и вывести рядом с значением в новую книгу.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.08.2013, 00:03   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Вообще мой вариант можно ускорить - вместо финального перебора словаря при просмотре последнего столбца сразу можно и собирать результат.
Только тогда циклы нужно менять, и в общем соответственно весь код. Не хочу
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 26.08.2013, 12:07   #6
Macjus
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 4
По умолчанию

Спасибо большое за быстрый отклик и за код, он работает.
Но как то странно.
В примере, который я выложил есть повторения.
И код их находит если взять значение и скопировать в 5 столбцов.
Если взять как есть, то выскакивает сообщение "Нет повторений"
Это же подтверждается и кодом от пользователя Czeslaw
Форматирование видит дубли.
Я проверил на тексте, повторения находятся, также если их прописать в столбцах.

Не пойму в чем проблема.
Может быть это проблема с данными, это экспорт из другой программы?
Macjus вне форума Ответить с цитированием
Старый 26.08.2013, 12:12   #7
Macjus
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 4
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Не хочу
Уважаемый Hugo121 вижу номер Вашего кошелька.
Какая цифра заставит Вас поменять свое решение?

Пожелания к доработке:
- скорость работы алгоритма не снижаем (предполагаемый объем данных 30000-50000 строк)
- данные о совпадениях добавляем не в новую книгу а в новый лист этой книги.
- есть еще несколько пожеланий не относящихся конкретно к этой задаче, но имеющей отношение к проекту, в случае заинтересованности готов предоставить.

Последний раз редактировалось Macjus; 26.08.2013 в 12:15.
Macjus вне форума Ответить с цитированием
Старый 26.08.2013, 12:17   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я делал под Ваше задание - вывести значение, если оно есть во всех столбцах.
Там в примере таких нет.
Если в рабочем такие видите, а код не находит - смотрите лишние пробелы (их кстати можно в коде trim'ом отрезать, но это тормозит, потому не добавлял).
Или форматом отображается одно, на самом деле значение другое - тогда можно брать не value, a text, но это думаю неправильно.
Ещё бывают некоторые глюки, когда значения по всему одинаковые, а код видит разницу - тогда может помочь cstr().
Думаю лучше покажите такие проблемные данные/ошибки в файле.

P.S.
Можно и в эту книгу лист добавлять, нет проблем.
Сумму могу назвать когда увижу конкретную задачу (не нужен весь файл, но нужен небольшой аналогичный по данным-форматам).
Пытался написать почту в личку - он недоступна. А тут светить не хочу - и так спама хватает...
Хотя думаю вполне народ и тут бесплатно поможет - особых проблем нет (как определить наличие во всех столбцах - я одно решение написал, других затруднений в задаче нет).
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 26.08.2013 в 12:31.
Hugo121 вне форума Ответить с цитированием
Старый 28.08.2013, 09:44   #9
Macjus
Новичок
Джуниор
 
Регистрация: 25.08.2013
Сообщений: 4
По умолчанию

Спасибо за помощь, разобрался. Все работает правильно.
Macjus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск совпадений. riniks17 Microsoft Office Excel 14 23.12.2012 19:57
Поиск совпадений tigran67 Паскаль, Turbo Pascal, PascalABC.NET 0 29.03.2012 16:44
Поиск совпадений KillJoy Паскаль, Turbo Pascal, PascalABC.NET 2 05.09.2011 11:53
Поиск совпадений Серёга0629 Microsoft Office Excel 9 29.08.2011 09:22
Поиск совпадений в БД _PROGRAMM_ PHP 6 21.05.2010 13:53