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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2013, 20:00   #1
Elpando
 
Регистрация: 01.08.2013
Сообщений: 5
По умолчанию поиск совпадений в 2 столбцах

Всех категорически приветствую! Тема такая: есть 2 столбца с данными (А и В). В столбце А около 10000 позиций, в столбце В тоже около 10000 позиций, но с изменениями (некоторые позиции удалены или добавлены). Так вот нужно произвести поиск и найти "непарные" позиции, т.е. те, которые есть либо только в столбце А, либо только в столбце В. И если эти "непарные" еще и подсветятся в столбцах, то с меня еще бОльшее спасибо за помощь) Я в excele совсем не разбираюсь, но жизнь заставила :-)
Elpando вне форума Ответить с цитированием
Старый 01.08.2013, 20:15   #2
Watcher_1
Форумчанин
 
Аватар для Watcher_1
 
Регистрация: 22.06.2011
Сообщений: 325
По умолчанию

Ловите
Код:
Sub m()
    Dim myF As Range
    i = 0
    Do
        i = i + 1
        If Range("A" & i) = "" And Range("B" & i) = "" Then Exit Do
        DoEvents
        Set myF = Columns(2).Find(Range("A" & i), , , xlWhole)
        If myF Is Nothing Then Range("A" & i).Interior.Color = vbRed
        Set myF = Columns(1).Find(Range("B" & i), , , xlWhole)
        If myF Is Nothing Then Range("B" & i).Interior.Color = vbRed
    Loop
End Sub
Заказать макрос можно на сайте http://excel4you.ru/
Watcher_1 вне форума Ответить с цитированием
Старый 01.08.2013, 20:28   #3
Elpando
 
Регистрация: 01.08.2013
Сообщений: 5
По умолчанию

спасиииииибо Watcher_1! помог! с меня пиво :-)
Elpando вне форума Ответить с цитированием
Старый 01.08.2013, 20:33   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

10000*10000 find'ами гонять? И красить...
Долго... Если много несовпадений - может и на час затянуться.
И затем нужно будет пару часов, чтоб глазами цвета отбирать - ещё не у всех 2007
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 01.08.2013 в 20:36.
Hugo121 вне форума Ответить с цитированием
Старый 01.08.2013, 20:40   #5
Watcher_1
Форумчанин
 
Аватар для Watcher_1
 
Регистрация: 22.06.2011
Сообщений: 325
По умолчанию

Уважаемый Hugo121
Согласен код далек от идеала.
НО с 10000*10000 вы загнули!!!
Вы наверное имели ввиду 10000*2?
Заказать макрос можно на сайте http://excel4you.ru/
Watcher_1 вне форума Ответить с цитированием
Старый 01.08.2013, 20:40   #6
Elpando
 
Регистрация: 01.08.2013
Сообщений: 5
По умолчанию

а есть предложения лучше? не откажусь от быстрого поиска)
Elpando вне форума Ответить с цитированием
Старый 01.08.2013, 20:41   #7
Watcher_1
Форумчанин
 
Аватар для Watcher_1
 
Регистрация: 22.06.2011
Сообщений: 325
По умолчанию

Цитата:
Сообщение от Elpando Посмотреть сообщение
спасиииииибо Watcher_1! помог! с меня пиво :-)
Для меня и + будет достаточно...
Заказать макрос можно на сайте http://excel4you.ru/
Watcher_1 вне форума Ответить с цитированием
Старый 01.08.2013, 23:16   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Да, с часом загнул - всего лишь 2 минуты работало.
Ну а 10000*10000 это даже мало - сперва 10000 раз искать по второй 10000, затем (т.е. параллельно перекрёстно) будет искать наоборот. Хотя это конечно быстрее чем цикл в цикле

Ну а быстрый вот - но без покраски. Зачем она?

Код:
Sub tt()
    Dim tm: tm = Timer
    Dim a(), dic1 As Object, dic2 As Object
    Dim x&, y&

    a = [a1].CurrentRegion.Value
    ReDim b(1 To UBound(a), 1 To 2)
    b(1, 1) = "есть только в первом"
    b(1, 2) = "есть только во втором"
    x = 1: y = 1
    Set dic1 = CreateObject("scripting.dictionary")
    Set dic2 = CreateObject("scripting.dictionary")

    For i = 1 To UBound(a)
        dic1.Item(a(i, 1)) = 0&
        dic2.Item(a(i, 2)) = 0&
    Next

    For i = 1 To UBound(a)
        If Not dic2.exists(a(i, 1)) Then x = x + 1: b(x, 1) = a(i, 1)
        If Not dic1.exists(a(i, 2)) Then y = y + 1: b(y, 2) = a(i, 2)
    Next

    [d1].Resize(Application.Max(x, y), 2) = b
    Debug.Print Timer - tm
End Sub
Покраску добавить легко - координаты ячейки есть, пример покраски в коде Watcher_1
Как бонус - таймер.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 01.08.2013 в 23:30.
Hugo121 вне форума Ответить с цитированием
Старый 02.08.2013, 00:20   #9
Step_UA
Форумчанин
 
Аватар для Step_UA
 
Регистрация: 09.06.2011
Сообщений: 388
По умолчанию

Если ТС достаточно покраски или как дополнение к коду Hugo121 - использовать условное форматирование ...
Вложения
Тип файла: rar различия 10000.rar (172.2 Кб, 14 просмотров)
на неконкретные вопросы даю неконкретные ответы ...

Последний раз редактировалось Step_UA; 02.08.2013 в 00:22.
Step_UA вне форума Ответить с цитированием
Старый 02.08.2013, 00:59   #10
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от Watcher_1 Посмотреть сообщение
Уважаемый Hugo121
Согласен код далек от идеала.
НО с 10000*10000 вы загнули!!!
Вы наверное имели ввиду 10000*2?
Разве
10000*10000 и 10000*2 -это не одно и то же.
Или визуально нулей меньше.
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск совпадений. riniks17 Microsoft Office Excel 14 23.12.2012 19:57
Поиск совпадений на разных листах и столбцах Sash414 Microsoft Office Excel 2 30.11.2011 22:17
Поиск совпадений KillJoy Паскаль, Turbo Pascal, PascalABC.NET 2 05.09.2011 11:53
Поиск значения в столбцах KReoN Microsoft Office Excel 12 26.10.2009 00:14
Поиск совпадений mistx Microsoft Office Excel 22 14.08.2009 13:41