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

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

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

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

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

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 19.01.2009, 06:47   #1
brokoli
 
Регистрация: 19.01.2009
Сообщений: 3
По умолчанию поиск макросом дубликатов в таблице эксель

Приветствую

появилась необходимость поиска повторяющихся улиц с номерами домов в таблице эксель с помощью макроса

Итак есть столбец "улица", рядом столбец "дом". Есть еще другие Столбцы в которых есть информация.
Если есть 2 записи в которых улица и номер дома идентичны, то подсветить красным цветом чтобы менеджер мог удалить лишнюю запись.
Так как дубликатов быть не должно.
Таблица состоит из 20 000! записей(строк)


Как можно было бы организовать алгоритм обхода так, чтобы это работало максимально производительно(быстро)
brokoli вне форума
Старый 19.01.2009, 07:20   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Прикрепите к сообщению пример файла (можно не весь, но столбцы с улицами и домами должны присутствовать)

А 20 000 строк - это не так уж и много.
Или у Вас комп очень медленный?

Последний раз редактировалось EducatedFool; 19.01.2009 в 07:40.
EducatedFool вне форума
Старый 19.01.2009, 15:17   #3
brokoli
 
Регистрация: 19.01.2009
Сообщений: 3
По умолчанию

комп вроде нормальный: два ядра по три гигагерца.

база во вложении
а также моя версия макроса))
Вложения
Тип файла: rar база улиц адресов 20000.rar (339.9 Кб, 92 просмотров)
Тип файла: rar duplicates_optimised.rar (1.2 Кб, 115 просмотров)
brokoli вне форума
Старый 19.01.2009, 16:22   #4
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Мне кажется макрос написан достаточно компактно и должен работать быстро. Единственное изменение которое сделал это поместил перед вторым циклом
Код:
         range2 = sStartCol & iNextRow & ":" & sStartCol & iLastRow
    '   ===
        For Each innercell In Range(range2)
        'MsgBox innerñell.address
            If R = getTrimCell2(innercell.address) Then
                Call paint_red(cell)
                Call paint_red(innercell)
            End If
        Next
условие if cell.Interior.ColorIndex <> 3 then тело второго цикла.

В этом случае будут пропускаться ячейки окашенные в красный цвет.
А насколько повыситься быстродействие суди сам
Юнлинг вне форума
Старый 19.01.2009, 18:12   #5
brokoli
 
Регистрация: 19.01.2009
Сообщений: 3
По умолчанию

думаю что проверка цвета почти ничего не даст..

вот щас подумал функцию getTrimCell2 надо переписать.

зачем каждый раз делать конкатенацию
Trim(Range(adr).Value) & Trim(Range(adr).Offset(0, 1).Value)

надо просто отдельно сравнивать парами
street1 = street2 and number1 = number2
brokoli вне форума
Старый 19.01.2009, 19:05   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

а макрос - это обязательно? просто подсветить одинаковые условным форматированием недостаточно?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 19.01.2009, 21:37   #7
brokoli
 
Регистрация: 19.01.2009
Сообщений: 3
По умолчанию

Цитата:
Сообщение от IgorGO Посмотреть сообщение
а макрос - это обязательно? просто подсветить одинаковые условным форматированием недостаточно?
отличная идея!!!

только вот в процессе реализации возникает сообщение такое
"недостаточно системных ресурсов для отображения диалогового окна"
и как его вылечить ?

у меня офис 2007 rus крякнутый
brokoli вне форума
Старый 19.01.2009, 23:06   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

идея плохая.
я посмотрел файл. оказалось порядка 250 строк - это повторы. слово обед 90 раз встретилось, 60 пустых строк...
Цитата:
подсветить красным цветом чтобы менеджер мог удалить лишнюю запись
не любите вы менеджеров, 250 строк удалять вручную!!! чтобы не было дубликатов... занятие совершенно дурное и сопряжено с возможными ошибками.
Макрос надо писать, который не подсветит, а который удалит дубликаты, что их подсвечивать.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума
Старый 20.01.2009, 07:26   #9
Юнлинг
Форумчанин
 
Регистрация: 17.10.2008
Сообщений: 239
По умолчанию

Цитата:
Сообщение от brokoli Посмотреть сообщение
думаю что проверка цвета почти ничего не даст..

вот щас подумал функцию getTrimCell2 надо переписать.

зачем каждый раз делать конкатенацию
Trim(Range(adr).Value) & Trim(Range(adr).Offset(0, 1).Value)

надо просто отдельно сравнивать парами
street1 = street2 and number1 = number2
При проверке цвета лишний раз не будет срабатывать второй цикл (повторного поиска одинаковых значений). Если цвет будет совпадать с красным незачем повторно искать эти же значения. Поиск уже осуществлен.
И подумай вот о чем, если первое из повторенных значений находиться ну скажем в первой сотни - цикл будет крутиться более 19900 что займет достаточно времени. Чем не сокращение времени поиска повторений

Я бы ввел дополнительное поле уже проверенных знаечний в какой нибудь из скрытых ячеек. Тогда первый цикл будет идти долго а вот поиск новых значений гораздо меньше. Надо будет найти совпадение вновь введенных занчений уже с отработанными. а это существенно меньше чем выполнять весь цикл

Последний раз редактировалось Юнлинг; 20.01.2009 в 07:29. Причина: Дополнение.
Юнлинг вне форума
Старый 20.01.2009, 08:05   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Такие темы встречались уже множество раз.

Немного переделал макрос из этой темы.

Вот что получилось... (см. вложение)

(добавлено)
Цитата:
Как можно было бы организовать алгоритм обхода так, чтобы это работало максимально производительно(быстро)
Мой макрос обрабатывает данные далеко не самым эффективным образом (перебором строк).
Но формирование выборки уникальных адресов происходит за несколько секунд (создаётся новый лист с выборкой).

При желании можно уменьшить время обработки до 1 секунды (если сразу считывать все адреса в массив, обрабатывать массив, а потом записывать массив на новый лист)

Можно удалять также пустые и полупустые строки (если Вы сформулируете требования к удаляемым строкам)
Вложения
Тип файла: rar база улиц адресов 20000.rar (403.6 Кб, 223 просмотров)

Последний раз редактировалось EducatedFool; 20.01.2009 в 08:11.
EducatedFool вне форума
Закрытая тема


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск слова в таблице (datagridview) kommunist Общие вопросы .NET 4 11.04.2010 20:38
Поиск значения в таблице solo7_77 Microsoft Office Excel 3 15.11.2008 01:26
поиск в таблице puma Помощь студентам 3 22.04.2008 23:56
Поиск в таблице БД фЁдОр БД в Delphi 13 14.11.2007 10:05
Поиск в таблице Voffka БД в Delphi 1 08.05.2007 01:16