Парная подсветка дубликатов
Среди стандартных средств Microsoft Excel есть много разных способов выделить дубликаты цветом. Самый простой и быстрый - с помощью условного форматирования. Для этого достаточно выделить диапазон ячеек и выбрать на вкладке Главная - Условное форматирование - Правила выделения ячеек - Повторяющиеся значения (Home - Conditional Formatting - Highlight Cells Rules - Duplicate Values):
Однако в этом случае цвет заливки у всех ячеек будет одинаковым, т.е. он просто сигнализирует о том, что у элемента где-то еще в диапазоне есть повторы, но никак не помогает их найти. Исправить ситуацию можно с помощью небольшого макроса, который будет заливать каждую пару (или больше) повторяющихся дубликатов своим цветом:
Так гораздо нагляднее, правда? Конечно, при большом количестве повторяющихся ячеек оттенки различить будет трудно, но при относительно небольшом количестве дубликатов этот способ сработает отлично.
Чтобы использовать этот макрос нажмите сочетание клавиш Alt+F11 или кнопку Visual Basic на вкладке Разработчик (Developer), вставьте новый пустой модуль через меню Insert - Module и скопируйте туда код этого макроса:
Sub DuplicatesColoring()
Dim Dupes() 'объявляем массив для хранения дубликатов
ReDim Dupes(1 To Selection.Cells.Count, 1 To 2)
Selection.Interior.ColorIndex = -4142 'убираем заливку если была
i = 3
For Each cell In Selection
If WorksheetFunction.CountIf(Selection, cell.Value) > 1 Then
For k = LBound(Dupes) To UBound(Dupes)
'если ячейка уже есть в массиве дубликатов - заливаем
If Dupes(k, 1) = cell Then cell.Interior.ColorIndex = Dupes(k, 2)
Next k
'если ячейка содержит дубликат, но еще не в массиве - добавляем ее в массив и заливаем
If cell.Interior.ColorIndex = -4142 Then
cell.Interior.ColorIndex = i
Dupes(i, 1) = cell.Value
Dupes(i, 2) = i
i = i + 1
End If
End If
Next cell
End Sub
Теперь можно выделить любой диапазон с данными на листе и запустить наш макрос с помощью сочетания клавиш Alt+F8 или через кнопку Макросы (Macros) на вкладке Разработчик (Developer).
Ссылки по теме
- Выделение дубликатов цветом
- Что такое макросы, куда вставлять код макроса на Visual Basic, как их запускать
- Как подсчитать количество уникальных значений в заданном диапазоне ячеек
Ну или дорабатывать макрос самому.
В любом случае, буду рад вашему варианту тут в комментариях
Sub DuplicatesColoring1() Set objDictDupes = CreateObject("Scripting.Dictionary" ) Selection.Interior.ColorIndex = -4142 i = 3 For Each cell In Selection If objDictDupes.Exists(cell.Value) Then If objDictDupes.Item(cell.Value).Interior.ColorIndex <> -4142 Then cell.Interior.ColorIndex = objDictDupes.Item(cell.Value).Interior.ColorIndex Else objDictDupes.Item(cell.Value).Interior.ColorIndex = i cell.Interior.ColorIndex = i i = i + 1 End If Else objDictDupes.Add cell.Value, cell End If Next End SubХотя на словаре должно, по идее, заметно быстрее работать на больших массивах, конечно
Из справки нарыл
Только мой макрос не зависнет при выделении всего листа (или, хотя бы, столбца) целиком,
и не вылетает с ошибкой, если найдено более 55 дубликатов
Самое главное знать, что есть такая возможность в экселе, а втрое знать где лежит такая ценная информация!
Павел, огромное Вам спасибо
Sub Выделить_несколько_строк3() Dim w1 As Range Dim wb As Workbook Set wb = ActiveWorkbook wb.Sheets(4).Activate myword = InputBox("Введите искомое слово:") For Each w1 In ActiveSheet.UsedRange.Cells If w1 <> Empty Then If w1 = Cells.Find(myword) Then w1.Select Selection.Interior.Color = RGB(255, 0, 0) End If End If Next w1 End Subсмена цвета должна происходить либо шагово (меняет код RGB на определенное число), либо в зависимости от количества. Например так:
Sub Выделить_несколько_строк3() Dim w1, nach As Range Dim redCLR, grCLR, blCLR As Byte Dim myword As String redCLR = 231 ' устанавливает счетчик красного для цвета grCLR = 231 ' устанавливает счетчик зеленого для цвета blCLR = 231 ' устанавливает счетчик синего для цвета Sheets(4).Activate Do ' запуск цикла myword = InputBox("Введите искомое слово:") ' ввод слова If myword = "" Then Exit Sub ' проверка на пустоту, если да - выход из цикла Set nach = Cells.Find(myword) ' устанавливает первую позицию слова If Not nach Is Nothing Then Set w1 = Cells.FindNext(nach) Else Exit Sub ' если слово найдено, ищет следующую позицию, если нет, завершение алгоритма Do ' запуск нового цикла w1.Interior.Color = RGB(redCLR, grCLR, blCLR) ' раскраска второй найденной ячейки If redCLR > 0 Then ' смена цвета redCLR = redCLR - 33 Else redCLR = 231 If grCLR > 0 Then grCLR = grCLR - 33 Else grCLR = 231 If blCLR > 0 Then blCLR = blCLR - 33 Else blCLR = 231 End If End If End If Set w1 = Cells.FindNext(w1) ' поиск следующей ячейки Loop While nach.Address <> w1.Address ' повтор цикла, если адрес 1ой найденной ячейки и следующей не совпадает Loop While myword <> "" ' повтор цикла, если слово не пустое End Sub), но видимо это не особо кому-либо нужно. Может здесь поможет?
Хотелось бы получить таблицу вида:
Заранее спасибо
И защита от макросов должна быть выключена, иначе даже работающий сохраненный в книге макрос будет заблокирован (Файл - Параметры - Центр Управления безопасностью).
Подскажите пож-та
когда копирую и вставляю код макроса то
вместо Dim Dupes() 'объявляем массив для хранения дубликатов - получается Dim Dupes() '????????? ?????? ??? ???????? ??????????
Почему так происходит?
Спасибо.
Возможно, что у вас Office изначально не английский и не русский, например французский или немецкий?
У меня та же проблема, что и у Михаила Никидимова. Я копировала макрос из вашего сайта и вставила в excel, но во-первых вместо русских слов стоят вопросы, во=вторых макрос так и не сработал. Excel у меня, если не ошибаюсь, стоит русский (все на русском, но не уверена что изначальная установка была на русском). Подскажите, Никоолай, что сделать, что бы заработало?
может кто-нибудь подсказать, как ее исправить?
сразу не сообразил...
Не работает макрос.
P.S. установлен Office 2013
При таком количестве повторов, мне кажется, нужен другой подход.
Подскажите, пожалуйста, как изменить Ваш макрос, чтобы он мог выделять повторяющиеся строки, состоящие из несколько столбцов, разными цветами?
На сайте нашел также Вашу статью "Выделение дубликатов цветом" (). Необходимо тоже самое, только чтобы выделения были разными цветами.
Range("A1").Interior.Color = RGB(255,127,0)Подскажите, пожалуйста, а если нужно в списке, где, например есть 3 дубля, первый попавший оставить некрашеным, а другие покрасить, как изменить макрос?
[URL]
[/URL]
Подскажите, для не профи в VBA, как и что в макросе Николая нужно поменять, чтоб можно было:
- залить ячейки повторяющиеся более 4-х (5, 6, 7...) раз (готов каждый раз заходить в макрос и менять "переменную" вручную);
- чтоб все-таки макрос не "вылетал" при большом объеме повторений (от 500+);
- цвета заливки сделать "по мягче" (т.к. после обработки предполагается распечатка данных на ч/б принтере).
пример:
180582233211021107134188
180582233211021107134110
Очень нужна помощь.
Есть 3 столбца с названиями клиентов. Все клиенты повторяются, но сортировка разная.
Как сделать так, что бы если я встал в ячейку Иванов в столбце 3, подсветились все ячейки Иванов в столбцах 1 и 2?