Skip to content
На чтение 3 мин. Просмотров 4.1k.
Что делает макрос: Всегда хотел выделить значения дубликатов в диапазоне. Макрос в этом разделе делает именно это. Есть много ручных способов найти и выделить дубликаты — способы, включающие формулы, условное форматирование, сортировку и т.д. Тем не менее, все эти методы требуют ручной настройки и определенного уровня обслуживания по мере изменения данных.
Этот макрос упрощает задачу, что позволяет найти и выделить дубликаты в ваших данных с помощью щелчка мыши.
Содержание
- Как макрос работает
- Код макроса
- Как этот код работает
- Как использовать
Как макрос работает
Этот макрос перечисляет ячейки в целевом диапазоне, используя оператор For Each, чтобы активировать каждую ячейку по одной за раз. Затем мы используем функцию СЧЕТЕСЛИ, чтобы подсчитать, сколько раз значение в активной ячейке находится в выбранном
диапазоне. Если это число больше единицы, то формат ячейки — желтого цвета.
Код макроса
Sub VidelitDublikati() 'Шаг 1: Объявляем переменные Dim MyRange As Range Dim MyCell As Range 'Шаг 2: определяем целевой диапазон Set MyRange = Selection 'Шаг 3: запускаем цикл через диапазон For Each MyCell In MyRange 'Шаг 4: Убедить, что ячейка имеет форматирование текста If WorksheetFunction.CountIf(MyRange, MyCell.Value) > 1 Then MyCell.Interior.ColorIndex = 36 End If 'Шаг 5: Получаем следующую ячейку в диапазоне Next MyCell End Sub
Как этот код работает
- На шаге 1 объявляются две переменные объекта Range, одна из которых называется MyRange для хранения всей цели диапазона, а другая называется MyCell для хранения каждой ячейки в диапазоне.
- Шаг 2 заполняет переменную MyRange целевым диапазоном. В этом примере мы используем выбранный диапазон — диапазон, который был выбран в электронной таблице. Вы можете легко установить переменную MyRange для определенного диапазона, например Range («A1: Z100»). Кроме того, если ваша цель — именованный диапазон, вы можете просто ввести его имя: Range («MyNamedRange»).
- Шаг 3 макрос начинает проходить по каждой ячейке в целевом диапазоне, активируя каждую ячейку.
- Объект WorksheetFunction позволяет нам запускать многие из Excel функции электронных таблиц в VBA. Шаг 4 использует объект WorksheetFunction для запуска Функция СЧЕТЕСЛИ в VBA.
В этом случае мы рассчитываем, сколько раз значение активной ячейки (MyCell.Value) найдено в заданном диапазоне (MyRange). Если выражение СЧЕТЕСЛИ оценивается больше 1, макрос изменяет цвет ячейки. - Шаг 5 возвращается к следующей ячейке. После активации всех ячеек в целевом диапазоне макрос заканчивается.
Как использовать
Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:
- Активируйте редактор Visual Basic, нажав ALT + F11.
- Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
- Выберите Insert➜Module.
- Введите или вставьте код.
Поиск повторяющихся значений (дубликатов) в одном из столбцов таблицы Excel и выделение их цветом заливки с помощью кода VBA.
Поиск дубликатов в столбце
Чаще всего повторяющиеся значения ищут в первом столбце таблицы, поэтому процедуру поиска дубликатов в VBA Excel рассмотрим именно на нем:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub DuplicateSearch() Dim ps As Long, myRange As Range, i1 As Long, i2 As Long ‘Определяем номер последней строки таблицы ps = Cells(1, 1).CurrentRegion.Rows.Count ‘Нет смысла искать дубликаты в таблице, состоящей из одной строки If ps > 1 Then ‘Присваиваем объектной переменной ссылку на исследуемый столбец Set myRange = Range(Cells(1, 1), Cells(ps, 1)) With myRange ‘Очищаем ячейки столбца от предыдущих закрашиваний .Interior.Color = xlNone For i1 = 1 To ps — 1 For i2 = i1 + 1 To ps If .Cells(i1) = .Cells(i2) Then ‘Если значения сравниваемых ячеек совпадают, ‘обеим присваиваем новый цвет заливки .Cells(i1).Interior.Color = 6740479 .Cells(i2).Interior.Color = 6740479 End If Next Next End With End If End Sub |
После ручного исправления или удаления повторяющихся значений, запускаем процедуру DuplicateSearch вновь, чтобы очистить от заливки ячейки столбца с уникальными значениями и заново выделить оставшиеся дубликаты.
Чтобы найти повторы в другом столбце, замените номер столбца в параметрах свойства Cells (в трех местах процедуры DuplicateSearch).
Константы для заливки
Для указания цвета заливки для ячеек с повторяющимися значениями вместо числового значения цвета можно использовать предопределенные константы:
Предопределенная константа | Наименование цвета |
---|---|
vbBlack | Черный |
vbBlue | Голубой |
vbCyan | Бирюзовый |
vbGreen | Зеленый |
vbMagenta | Пурпурный |
vbRed | Красный |
vbWhite | Белый |
vbYellow | Желтый |
Как известно, в последних версиях Excel легко выделить дубликаты цветом, — для этого есть специальная опция в «условном форматировании».
Достаточно выделить диапазон, задать цвет заливки, — и все повторяющиеся (или, наоборот, уникальные) значения будут выделены.
Но иногда требуется, чтобы различные повторяющиеся значения были выделены РАЗНЫМИ ЦВЕТАМИ.
В этом случае, без макросов не обойтись.
Ниже приведён макрос, который как раз и решает эту задачу
(достаточно выделить диапазон ячеек, запустить макрос, — и повторяющиеся непустые ячейки получат одинаковый цвет заливки)
Sub ВыделитьДубликатыРазнымиЦветами() On Error Resume Next ' массив цветов, используемых для заливки ячеек-дубликатов Colors = Array(12900829, 15849925, 14408946, 14610923, 15986394, 14281213, 14277081, _ 9944516, 14994616, 12040422, 12379352, 15921906, 14336204, 15261367, 14281213) Dim coll As New Collection, dupes As New Collection, _ cols As New Collection, ra As Range, cell As Range, n& Err.Clear: Set ra = Intersect(Selection, ActiveSheet.UsedRange) If Err Then Exit Sub ra.Interior.ColorIndex = xlColorIndexNone: Application.ScreenUpdating = False For Each cell In ra.Cells ' запонимаем значение дубликатов в коллекции dupes Err.Clear: If Len(Trim(cell)) Then coll.Add CStr(cell.Value), CStr(cell.Value) If Err Then dupes.Add CStr(cell.Value), CStr(cell.Value) Next cell For i& = 1 To dupes.Count ' заполняем коллекцию cols цветами для разных дубликатов n = n Mod (UBound(Colors) + 1): cols.Add Colors(n), dupes(i): n = n + 1 Next For Each cell In ra.Cells ' окрашиваем ячейки, если для её значения назначен цвет cell.Interior.color = cols(CStr(cell.Value)) Next cell Application.ScreenUpdating = True End Sub
0 / 0 / 0 Регистрация: 24.05.2008 Сообщений: 4 |
|
1 |
|
19.01.2009, 15:57. Показов 40055. Ответов 8
Регистрация: 19.01.2009 появилась необходимость поиска повторяющихся улиц с номерами домов в таблице эксель с помощью макроса Итак есть столбец «улица», рядом столбец «дом». Есть еще другие Столбцы в которых есть информация. Как можно было бы организовать алгоритм обхода так, чтобы это работало максимально производительно(быстро) во вложении к посту
0 |
32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
|
19.01.2009, 20:01 |
2 |
Пока не шочу слишком глубоко вдаваться в идею самого макроса, но думаю, гораздо удобнее сначала отсортировать таблицу excell по улицам в алфавитном порядке (макрос для этого можно не писать в ручную, а воспользоваться командой «Запись макроса» и выбрать сортировку по возрастанию или убыванию). В отсортированной таблице поиск повторяющихся элементов не должен занять много времени, особенно если воспользоваться «бинарным поиском». Примечание:
0 |
loter 2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
||||
20.01.2009, 22:43 |
3 |
|||
я в макросах не сильна, но эту задачу можно решить еще вот так:
по такому алгоритму у меня расчет занял 22 минуты 12 секунд. не знаю быстрее это или медленее чем у Вас, но мало ли… м.б. пригодится. если доступна сотировка, то есть более быстрый и простой механизм, только он делается не макросом, а формулой. сортируем сначала по а, затем по б и в пустой столбец во вторую строку забиваем формулу «=если((A2=A3)*И(B2=B3);1;»»)». растягиваем формулу до конца.
0 |
32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
|
21.01.2009, 18:19 |
4 |
Loter. Ты прав на все 100%. Однако вся прелесть макросов — это автоматизация твоих действий. Представь, что тебе каждый раз после ввода новых данных необходимо будет сначала отсортировать таблицу, потом выбрать специальный столбец, куда можно будет ввести предложенную тобой формулу с ЕСЛИ, растянуть ее (на несколько тысяч записей). Потом найти все строки, в которых твоя формула дает 1 и, наконец, выделив их, залить красным цветом. У-Ф-Ф-Ф… Даже рука устала писать. Гораздо проще все это проделать одним кликом по кнопке, который присвоен специальный макрос. Кстати.
0 |
loter 2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
||||
22.01.2009, 18:01 |
5 |
|||
хм….
на базу в 6000 заняло меньше 5 секунд
0 |
maximus09 32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
||||
23.01.2009, 17:57 |
6 |
|||
Не знаю как bloogrox, а я результатом в общем и целом удовлетворен. Единственное, на что нужно обратить внимание — это то, что сейчас программа использует дополнительный столбец книги Excell для того чтобы ввести формулу
Это не всегда хорошо. Поиск можно осуществить простым перебором ячеек, не выводя никакой дополнительной информации на листы книги Excell.
0 |
2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
|
23.01.2009, 20:16 |
7 |
maximus09, а о каких встроенных механизмах сортировки ты говорил?
0 |
32 / 32 / 4 Регистрация: 29.12.2008 Сообщений: 75 |
|
23.01.2009, 20:39 |
8 |
Почитай мое первое сообщение. Там найдешь такие слова: (макрос для этого можно не писать в ручную, а воспользоваться командой «Запись макроса» и выбрать сортировку по возрастанию или убыванию). В отсортированной таблице поиск повторяющихся элементов не должен занять много времени, особенно если воспользоваться «бинарным поиском». Примечание: Если перед выбором команды Данные -> Сортировка выбрать команду Сервис ->Макрос->Начать запись, а после того, как сортировка выполнится вручную остановить запись макроса, то Excell автоматически сама создаст макрос сортировки. Программисту останется только его немножко подправить под свои нужды и включить то, что получится в итоге, в текст программы поиска повторяющихся элементов. Более подробно об описанном здесь механизме программирования можно прочитать в книге Кстати, там данный пример ручной с сортировкой описан в подробностях (что, какие опции в окне параметров сортировки нужно выбирать, зачем нужно выделять всю таблицу прежде чем производить сортировку и т.п.). Очень рекомендую книгу. Сам учился по ней. Но, стоит сказать, что она целиком посвящена VBA в Excell.
0 |
2 / 2 / 0 Регистрация: 16.01.2009 Сообщений: 11 |
|
24.01.2009, 07:03 |
9 |
спасибо. книжку посмотрю.
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
24.01.2009, 07:03 |
9 |
Очень часто при работе c таблицами Excel возникают ситуации, в которых необходимо сравнить несколько списков, найти в них повторяющиеся значения и что-то с ними сделать. Оптимальный способ поиска и обработки дубликатов должен быть выбран в зависимости от типа исходных данных и желаемого результата. Цель данной статьи — разобрать все возможные варианты обработки дубликатов в Excel в одной статье для того, чтобы читатель мог выбрать оптимальный вариант для любой ситуации.
Оглавление:
- Выделение
- Поиск и выделение повторяющихся значений ячеек в одном списке — условное форматирование
- Поиск и выделение повторяющихся значений ячеек в нескольких списках — условное форматирование
- Поиск и выделение повторяющихся значений ячеек — макрос Excel-VBA
- Поиск и выделение повторяющегося текста внутри ячеек — макрос Excel VBA
- Замена
- Замена дублирующихся значений ячеек с помощью макроса Excel-VBA
- Подстановка в другие таблицы
- Функция ВПР (VLOOKUP)
- Комбинация функций ИНДЕКС + ПОИСКПОЗ (INDEX+MATCH)+СЧЁТ()+ЕСЛИ()
- Подсчёт
- Посчитать количество повторений в одном списке
- Сравнение двух списков используя формулу подсчёта повторений
- Подсчёт количества повторений значений в строках с помощью макросов Excel-VBA
- Функция СЧЁТЕСЛИ (COUNTIF)
- Поиск
- Поиск повторений значений в ячейках с помощью макроса Excel-VBA
- Скрытие
- Сортировка и фильтр
- Скрытие строк с помощью макроса Excel-VBA
- Удаление
- Данные -> удалить дубликаты
- Умные таблицы. Форматировать как таблицу -> удалить дубликаты
Функции в каждом разделе описаны в порядке возрастания их сложности и трудоемкости использования.
Выделение
Поиск и выделение повторяющихся значений ячеек в одном списке — условное форматирование
1. Выделить все значения в списке
2. Вкладка «Главная» -> Условное форматирование -> Правила выделения ячеек -> Повторяющиеся значения
3. Выбрать необходимый формат (в данном случае выбран красный шрифт на светло-красном фоне)
Результат:
Если применить данное условное форматирование ко всему столбцу A, то все новые дубликаты, добавленные после строки 10 также будут отформатированы по заданному правилу.
Поиск и выделение повторяющихся значений ячеек в нескольких списках — условное форматирование
Сначала необходимо выделить столбцы (диапазоны ячеек) с дубликатами. Далее необходимо проделать действия, описанные в предидушем разделе начиная с шага 2.
Недостаток данного способа выделения дубликатов — визуально не определить, продублированы ли значения внутри каждого из списков, или между списками. В данном примере «малина» дублируется внутри списка 1, а «банан» и «груша» выделены потому что они продублированы между списками.
Для того, чтобы дублирование внутри списков воспринималось отдельно от дублирования между списков можно повторно использовать другое условное форматирование для каждого из столбцов по отдельности.
1. Выделяем первый столбец:
2. Вкладка «Главная» -> Условное форматирование -> Правила выделения ячеек -> Повторяющиеся значения
3. Пользовательский формат
4. Выбираем, например, одинарное подчеркивание, жирный шрифт и фиолетовый цвет.
5. Повторяем операцию с шага 2 для столбца B и получаем:
Поиск и выделение повторяющихся значений ячеек — макрос Excel-VBA
Скачать пример в Excel
Sub search_highlight_duplicates()
Dim Arr(16, 1) As String 'сравниваем значения как текст
'массив двухмерный
'16 на 2
'элементы 1-16,0 содержат значения ячеек
'элементы 1-16,1 - является ли соответсвующее значение дубликатом
For i = 1 To 16
Arr(i, 0) = ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value 'записываем в массив
Next i
For k = 1 To UBound(Arr, 1)
CurrentItem = Arr(k, 0) 'достаём по одному элементы из массива 1-16,0
For i = 1 To UBound(Arr, 1)
If CurrentItem = Arr(i, 0) And i <> k Then Arr(i, 1) = "COPY"
'сравниваем с другими элементами массива (за исключением себя самого)
'для копий записываем в 1-16,0 "COPY"
Next i
Next k
For i = 1 To UBound(Arr, 1)
ThisWorkbook.Sheets("Sheet1").Cells(i, 2).Value = Arr(i, 1)
'запишем результат обратно в таблицу в колонку 2
'либо здесь можно прописать особенное форматирование для каждого элемента исходного массива
Next i
End Sub
То же самое, но через форматирование ячеек:
Скачать пример в Excel
Sub search_highlight_duplicates()
Dim Arr(16, 1) As String
For i = 1 To 16
Arr(i, 0) = ThisWorkbook.Sheets("Sheet1").Cells(i, 1).Value
Next i
For k = 1 To UBound(Arr, 1)
CurrentItem = Arr(k, 0)
For i = 1 To UBound(Arr, 1)
If CurrentItem = Arr(i, 0) And i <> k Then Arr(i, 1) = "COPY"
Next i
Next k
For i = 1 To UBound(Arr, 1)
If Arr(i, 1) = "COPY" Then
With ThisWorkbook.Sheets("Sheet1").Cells(i, 1)
With .Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
With .Font
.Color = -16776961
.TintAndShade = 0
End With
End With
End If
Next i
End Sub
Поиск и выделение повторяющегося текста внутри ячеек — макрос Excel VBA
Возможно существуют и другие более эффективные способы выделения копий слов внутри ячеек, но здесь будет описан только простейший способ, на который натолкнёт запись действий макрорекордером. Если мы напишем длинный текст в ячейке, включим запись макроса и отформатируем часть текста в ячейке, то получим примерно следующее:
Таким образом, для выделения отдельных слов в ячейке нам нужно предварительно найти, где расположен нужный нам набор символов, а также его длину для каждого повторения.
Замена
Замена дублирующихся значений ячеек с помощью макроса Excel-VBA
Подстановка в другие таблицы
Функция ВПР (VLOOKUP)
Об использовании функции ВПР пошагово.
Комбинация функций ИНДЕКС + ПОИСКПОЗ (INDEX+MATCH)+СЧЁТ()+ЕСЛИ()
Если таблица, из которой мы хотим доставать значения для подстановки содержит дубликаты, то использование функции ВПР может не дать нужного результата, так как ВПР использует первое попавшееся совпадение и результат будет зависит от сортировки.