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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.12.2012, 19:24   #1
riniks17
Форумчанин
 
Регистрация: 15.12.2011
Сообщений: 355
По умолчанию Поиск совпадений.

Уважаемые форумчане. С Наступающим вас Светлым Праздником.
Вы уже научили меня как определить с помощью формул наличие совпадений по двум столбцам на листе 1 и листе 2. Возможно ли сделать это с помощью условного форматирования? Т.е. выделить цветом всех индивидумов на листе 1 которые встречаются на листе 2. И можно ли сделать это при помощи макроса? Уверен что можно. Поэтому и обращаюсь. Особая благодарность если код макроса будет с пояснениями. Заранее огромное спасибо и ещё раз с наступающими праздниками.
Вложения
Тип файла: zip Совпадения.zip (8.6 Кб, 18 просмотров)

Последний раз редактировалось riniks17; 22.12.2012 в 19:35. Причина: Добавить вложение
riniks17 вне форума Ответить с цитированием
Старый 22.12.2012, 20:23   #2
aNJay
 
Регистрация: 22.12.2012
Сообщений: 7
По умолчанию

Попробуй етот код:
Код:
Sub find_repeat()
Dim n1 As Integer, n2 As Integer, i As Integer, j As Integer, iRow As Integer
iRow = 2
n1 = Sheets("Лист1").Cells(2, iRow).End(xlDown).Row
n2 = Sheets("Лист2").Cells(2, iRow).End(xlDown).Row
For i = 2 To n1
    For j = 2 To n2
        If Sheets("Лист1").Cells(i, iRow).Value & Sheets("Лист1").Cells(i, iRow + 1).Value = Sheets("Лист2").Cells(j, iRow).Value & Sheets("Лист2").Cells(j, iRow + 1).Value Then 'повтор
'            Sheets("Лист1").Cells(i, iRow).Interior.Color = 65535
'            Sheets("Лист1").Cells(i, iRow + 1).Interior.Color = 65535
            Sheets("Лист1").Cells(i, iRow).Font.Color = -16776961
            Sheets("Лист1").Cells(i, iRow + 1).Font.Color = -16776961
        End If
    Next
Next
End Sub
aNJay вне форума Ответить с цитированием
Старый 22.12.2012, 21:19   #3
bize
Форумчанин
 
Регистрация: 07.01.2012
Сообщений: 152
По умолчанию

я не сильный знаток но вроде работает)
Вложения
Тип файла: rar Совпадения1.rar (10.2 Кб, 21 просмотров)
bize вне форума Ответить с цитированием
Старый 22.12.2012, 23:15   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

aNJay, забудьте по Integer вообще, ну а тут это явно ведёт к ошибке, если лист будет заполнен хотя бы на половину.
Ну и думаю это самый медленный код из возможных...
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.12.2012, 23:24   #5
riniks17
Форумчанин
 
Регистрация: 15.12.2011
Сообщений: 355
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
aNJay, забудьте по Integer вообще, ну а тут это явно ведёт к ошибке, если лист будет заполнен хотя бы на половину.
Ну и думаю это самый медленный код из возможных...
Есть варианты?
riniks17 вне форума Ответить с цитированием
Старый 22.12.2012, 23:32   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Так будет побыстрее:
Код:
Sub compare()
    Dim a(), i&
    Application.ScreenUpdating = False

    With Sheets("Лист2")
        a = Range(.[C2], .Range("B" & .Rows.Count).End(xlUp)).Value
    End With
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(a): .Item(a(i, 1) & "|" & a(i, 2)) = 0&: Next
        With Sheets("Лист1")
            a = Range(.[C2], .Range("B" & .Rows.Count).End(xlUp)).Value
        End With
        For i = 1 To UBound(a)
            If .exists((a(i, 1) & "|" & a(i, 2))) Then
                Sheets("Лист1").Range("B" & i + 1 & ":C" & i + 1).Font.Color = -16776961
            End If
        Next
    End With
    Application.ScreenUpdating = True

End Sub
Но конечно основной тормоз - это покраска. Хотя и это можно ускорить... если будет критично.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.12.2012, 23:47   #7
riniks17
Форумчанин
 
Регистрация: 15.12.2011
Сообщений: 355
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Так будет побыстрее:
Код:
Sub compare()
    Dim a(), i&
    Application.ScreenUpdating = False

    With Sheets("Лист2")
        a = Range(.[C2], .Range("B" & .Rows.Count).End(xlUp)).Value
    End With
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(a): .Item(a(i, 1) & "|" & a(i, 2)) = 0&: Next
        With Sheets("Лист1")
            a = Range(.[C2], .Range("B" & .Rows.Count).End(xlUp)).Value
        End With
        For i = 1 To UBound(a)
            If .exists((a(i, 1) & "|" & a(i, 2))) Then
                Sheets("Лист1").Range("B" & i + 1 & ":C" & i + 1).Font.Color = -16776961
            End If
        Next
    End With
    Application.ScreenUpdating = True

End Sub
Но конечно основной тормоз - это покраска. Хотя и это можно ускорить... если будет критично.
Поклон. Работает.
А не в тягость объяснить код? Хочу сам научиться так же.
Пардоньте, поменял на листе 2 фигурантов и они просто добавились в лист 1. Старые так и остались отформатированными. Хотелось бы обновлять по значениЯм на листе 2.

Последний раз редактировалось riniks17; 22.12.2012 в 23:58.
riniks17 вне форума Ответить с цитированием
Старый 23.12.2012, 00:02   #8
riniks17
Форумчанин
 
Регистрация: 15.12.2011
Сообщений: 355
По умолчанию

Цитата:
Сообщение от bize Посмотреть сообщение
я не сильный знаток но вроде работает)
Спасибо. Пока буду пользовать этот вариант.
riniks17 вне форума Ответить с цитированием
Старый 23.12.2012, 00:09   #9
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Ну если "поменял", то и код нужно поменять
Там нет предварительной очистки форматирования, да и есть привязка к столбцам и второй строке

По алгоритму кода (каждую строку описывать лениво):
1. берём данные второго листа в массив
2. циклом его перебираем и заносим критерии в словарь
3. берём данные первого листа в массив
4. циклом его перебираем и проверяем наличие критерия в словаре - если есть, то красим соответствующую строку.

Итого всего два прохода по данным (а не цикл в цикле), и по массивам, а не по ячейкам листа.
На примере конечно разницу не увидите, но попробуйте код хотя бы на 1000 строк. А лучше на 10000
Я бы не красил, а заполнял параллельный массив единицами, затем его выгрузил на лист рядом с данными. Преимущества - не крадёт время (думаю пара процентов общего времени, хотя не замерял), можно сортировать по этим значениям и под 2003, не меняет ничего в данных (там уже могут быть крашеные ячейки). Не нужно предварительно ничего очищать - старые метки затрутся при выгрузке массива
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 23.12.2012, 00:31   #10
riniks17
Форумчанин
 
Регистрация: 15.12.2011
Сообщений: 355
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Ну если "поменял", то и код нужно поменять
Там нет предварительной очистки форматирования, да и есть привязка к столбцам и второй строке

По алгоритму кода (каждую строку описывать лениво):
1. берём данные второго листа в массив
2. циклом его перебираем и заносим критерии в словарь
3. берём данные первого листа в массив
4. циклом его перебираем и проверяем наличие критерия в словаре - если есть, то красим соответствующую строку.

Итого всего два прохода по данным (а не цикл в цикле), и по массивам, а не по ячейкам листа.
На примере конечно разницу не увидите, но попробуйте код хотя бы на 1000 строк. А лучше на 10000
Я бы не красил, а заполнял параллельный массив единицами, затем его выгрузил на лист рядом с данными. Преимущества - не крадёт время (думаю пара процентов общего времени, хотя не замерял), можно сортировать по этим значениям и под 2003, не меняет ничего в данных (там уже могут быть крашеные ячейки). Не нужно предварительно ничего очищать - старые метки затрутся при выгрузке массива
Панятно. Я тож ленивый. Буду гуглить каждую строчку и пытаться понять. А смысл задачи в том, что меняя фигурантов нв втором листе, иметь возможность выделять их на первом. Можно и параллельный массив, можно и перпендикулярный, главное результат. Надо на лист 2 скопировать список и отметить этих товарищей на первом листе. И так множество раз.
riniks17 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск совпадений 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
Поиск совпадений Claster Общие вопросы Delphi 4 22.06.2011 17:34
Поиск совпадений в БД _PROGRAMM_ PHP 6 21.05.2010 13:53