Поиск повторяющихся значений (дубликатов) в одном из столбцов таблицы 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 | Желтый |
23 / 23 / 12 Регистрация: 13.09.2010 Сообщений: 88 |
|
1 |
|
Поиск одинаковых значений в столбце26.09.2011, 14:41. Показов 23032. Ответов 11
Добрый день. Не могу разобраться с одной задачей на Excel. Дан одномерный массив, занесенный в столбец Excel. Необходимо найти количество повторений числа, но только того которое стоит раньше, чем другие числа имеющие повторения…
7 В итоге получается что необходимо посчитать сколько « 5» у нас в массиве. Также нужно посчитать на какой позиции находится первая считаемая цифра (в нашем случае «5» на позиции 2).
0 |
15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
26.09.2011, 15:44 |
2 |
Со вспомогательным столбцом:
2 |
23 / 23 / 12 Регистрация: 13.09.2010 Сообщений: 88 |
|
26.09.2011, 17:07 [ТС] |
3 |
Спасибо огромное, а как это изобразить в виде макроса?
0 |
19vitek 730 / 406 / 95 Регистрация: 19.12.2010 Сообщений: 756 |
||||||
26.09.2011, 17:43 |
4 |
|||||
Сообщение было отмечено Памирыч как решение Решениекак вариант.
Вложения
1 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
26.09.2011, 17:51 |
5 |
|||
Можно так:
2 |
23 / 23 / 12 Регистрация: 13.09.2010 Сообщений: 88 |
|
26.09.2011, 19:18 [ТС] |
6 |
спасибо большое!!! Добавлено через 3 минуты ну вроде индекс 1-ой 5 — 2
0 |
19vitek 730 / 406 / 95 Регистрация: 19.12.2010 Сообщений: 756 |
||||
26.09.2011, 19:29 |
7 |
|||
Сообщение было отмечено Памирыч как решение Решение
1 |
23 / 23 / 12 Регистрация: 13.09.2010 Сообщений: 88 |
|
26.09.2011, 19:37 [ТС] |
8 |
А чтобы вывести только искомые индексы всех 5 как это сделать?
0 |
19vitek 730 / 406 / 95 Регистрация: 19.12.2010 Сообщений: 756 |
||||
26.09.2011, 19:47 |
9 |
|||
1 |
23 / 23 / 12 Регистрация: 13.09.2010 Сообщений: 88 |
|
26.09.2011, 20:00 [ТС] |
10 |
Не обижайтесь пожалуйста, но меня просто интересует индекс именно второй цифры 5, как его программно запомнить, он мне нужен будет для расчетов….
0 |
19vitek 730 / 406 / 95 Регистрация: 19.12.2010 Сообщений: 756 |
||||
26.09.2011, 20:17 |
11 |
|||
ИМЕННО ВТОРОЙ ИЛИ ПОСЛЕДНЕЙ? Добавлено через 12 минут
1 |
23 / 23 / 12 Регистрация: 13.09.2010 Сообщений: 88 |
|
26.09.2011, 20:57 [ТС] |
12 |
Именно второй Добавлено через 1 минуту
0 |
mtts54 Пользователь Сообщений: 164 |
Добрый день, уважаемые форумчане! В поиске есть аналогичные темы, но подходящего мне я не нашел. Суть проблемы: есть табличка ~200 тыс. строк на 60 столбцов. В столбце G — некий идентификатор id, он может быть уникальным, а может повторяться. Буду благодарен за помощь с помощью VBA найти и вырезать из данной таблицы строки с повторяющимися id и перенести их на другой лист. Excel непознаваем как атом. |
Возможно я не правильно понял задачу…. Но самый простой вариант |
|
Если нужен именно макрос, то делаем все тоже самое через макрорекодер (за исключением выделения ячеек отфильтрованных, для копирования). https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=47173 |
|
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
mtts54, здравствуйте! Изменено: Jack Famous — 15.08.2018 11:14:43 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
С помощью доп.столбца. Файл положить в папку С:1, на таблице ПКМ-обновить. Неизлечимых болезней нет, есть неизлечимые люди. |
mtts54 Пользователь Сообщений: 164 |
Михаил Комиссаров
, автофильтр «видит» только 10 тыс. строк, поэтому этот прием не годится. Jack Famous , конечный результат в файле-примере таков: на Листе1 строк с подсвеченными id не должно быть — они должны появиться на другом, вставленном листе. В реальном файле из-за большого количества строк УФ неприменимо. Excel непознаваем как атом. |
mtts54 Пользователь Сообщений: 164 |
TheBestOfTheBest
, не совсем то, что необходимо: в Вашем решении одна из повторяющихся строк остается на исходном листе. Мне же нужно ВСЕ строки с повторяющимися id вырезать с исходного листа и вставить на другой лист. Честно говоря, я не понял, каким приемом Вы решили задачу. Спасибо за ответ. Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#8 15.08.2018 13:19:11 mtts54, пробуйте
UPD (15:05): 14я строка кода Set rng = Cells(1, col).Resize(r+ 1, 1) исправлена на Set rng = Cells(2, col).Resize(r, 1). Файл заменён. Прикрепленные файлы
Изменено: Jack Famous — 15.08.2018 15:07:53 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
Ігор Гончаренко Пользователь Сообщений: 13746 |
#9 15.08.2018 14:30:52 выполните этот макрос
при активном листе с данными Изменено: Ігор Гончаренко — 15.08.2018 14:34:29 Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
||
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
#10 15.08.2018 14:39:42
Внешний запрос (Данные-Получение внешних данных…). Измените формулу в столбце Ключ =СЧЁТЕСЛИ($G$2:$G$348;G2), обновите таблицы как указано выше. Изменено: TheBestOfTheBest — 15.08.2018 14:40:31 Неизлечимых болезней нет, есть неизлечимые люди. |
||
кузя1972 Пользователь Сообщений: 189 |
#11 15.08.2018 16:37:15 вариант макроса(не нашел как надо в исходном файл -примере),кнопки unic и очистка,лист1 добавлен вручную
Прикрепленные файлы
Изменено: кузя1972 — 15.08.2018 16:37:30 |
||
mtts54 Пользователь Сообщений: 164 |
Коллеги, спасибо за ответы. Сегодня тестировать некогда (комп занят расчетами), отпишусь завтра. Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
mtts54, мы ждём (ну я точно жду фидбэк) Изменено: Jack Famous — 16.08.2018 10:15:51 Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Nordheim Пользователь Сообщений: 3154 |
#14 16.08.2018 10:51:18 Вариант на массивах и словарях
«Все гениальное просто, а все простое гениально!!!» |
|
mtts54 Пользователь Сообщений: 164 |
Добрый день! Протестировал макрос от Ігор Гончаренко на реальном файле размером 31 колонка на 153 тыс.строк. В макросе в выражениях Offset(0, 9) заменил 9 на 25 и в Columns(16) заменил 16 на 32. Макрос работал ок. 10 минут, нашел все 7696 повторов. Хотелось бы побыстрее, но… размер имеет значение. Спасибо! Остальные решения протестирую завтра. Excel непознаваем как атом. |
mtts54 Пользователь Сообщений: 164 |
Попробовал на том же реальном файле макрос от Jack Famous . К сожалению, макрос где-то зациклился и после 20 минут ожидания я был вынужден остановить его выполнение Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
#17 17.08.2018 11:45:00 mtts54, немного изменил принцип удаления строк из исходника — пробуйте
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
|
mtts54 Пользователь Сообщений: 164 |
На том же реальном файле макрос Nordheim за 2 секунды нашел все повторы, вставил лист и скопировал повторы туда (правда, пару раз VBA ругнулся: не была объявлена переменная sht1 — это я поправил). Но с исходного листа макрос повторы не удалил . Тут я ничего поделать не смог . Очень надеюсь, что уважаемый Nordheim прочтет этот пост и подправит код Excel непознаваем как атом. |
Jack Famous Пользователь Сообщений: 10848 OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome |
mtts54, вы бы выложили ссылку на файл реального объёма, но без конфиденциальных данных — тестить проще было бы Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄ |
Nordheim Пользователь Сообщений: 3154 |
#20 17.08.2018 12:27:31 В данном коде есть нюанс, таблица должна начинаться со второй строки, шапка таблицы на первой
«Все гениальное просто, а все простое гениально!!!» |
||
Kuzmich Пользователь Сообщений: 7998 |
#21 17.08.2018 12:36:19 Nordheim,
при формировании листа Дубли я бы добавил первой строку
Изменено: Kuzmich — 17.08.2018 12:48:30 |
||||
mtts54 Пользователь Сообщений: 164 |
Excel непознаваем как атом. |
kryptonets Пользователь Сообщений: 5 |
Я вижу,что нужен макрос. Но предложу другое решение. Надстройка PowerQuery. Выделить таблицу Ctrl+T, с заголовками.PowerQuery—>Из таблицы,диапазона.Главная—>Сохранять строки—>Сохранять дубликаты.Выгрузить.Готово) |
Nordheim Пользователь Сообщений: 3154 |
#24 17.08.2018 13:03:43
sht1 в файле это название листа в VBAProject, поэтому лист не объявлен, на кириллице неудобно было писать, поэтому переименовал по ходу написания кода «Все гениальное просто, а все простое гениально!!!» |
||
Nordheim Пользователь Сообщений: 3154 |
#25 17.08.2018 13:05:09
С какой целью? «Все гениальное просто, а все простое гениально!!!» |
||
mtts54 Пользователь Сообщений: 164 |
Nordheim
, макрос (с учетом от Kuzmich ) отработал немного дольше (это абсолютно не критично), повторы с исходного листа удалил. Спасибо! kryptonets , нужен именно макрос, т.к. таблица обрабатывается макросом (моим) и прерывать его для ручной работы неудобно. Тем не менее попробую Вашу идею — лишних знаний ведь не бывает, когда-нибудь пригодится. Спасибо. Excel непознаваем как атом. |
Kuzmich Пользователь Сообщений: 7998 |
#27 17.08.2018 13:17:04 Nordheim, написал
Просто на листе Дубли в столбце К появляются ячейки с янв.92 вместо 1-92 Изменено: Kuzmich — 17.08.2018 13:17:18 |
||
Nordheim Пользователь Сообщений: 3154 |
#28 17.08.2018 13:18:40
А строка зачем? «Все гениальное просто, а все простое гениально!!!» |
||
Kuzmich Пользователь Сообщений: 7998 |
#29 17.08.2018 13:22:51 Я имел в виду этот кусок макроса
Чтобы не было преобразования в дату |
||
Nordheim Пользователь Сообщений: 3154 |
#30 17.08.2018 13:23:27 Наверно так более правильно.
Изменено: Nordheim — 17.08.2018 13:25:52 «Все гениальное просто, а все простое гениально!!!» |
||
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Office для бизнеса Excel 2010 Excel 2007 Еще…Меньше
Чтобы сравнить данные в двух столбцах Microsoft Excel и найти повторяющиеся записи, воспользуйтесь следующими способами.
Способ 1. Использование формулы на этом этапе
-
Начните Excel.
-
На новом примере введите следующие данные (оставьте столбец B пустым):
A
B
C
1
1
3
2
2
5
3
3
8
4
4
2
5
5
0
-
Введите в ячейку B1 следующую
формулу:=IF(ISERROR(MATCH(A1,$C$1:$C$5,0)),»»,A1)
-
Выберем ячейку С1 по B5.
-
В Excel 2007 и более поздних версиях Excel выберите Заполнить в группе Редактирование, а затем выберите Вниз.
Повторяющиеся числа отображаются в столбце B, как в следующем примере:
A
B
C
1
1
3
2
2
2
5
3
3
3
8
4
4
2
5
5
5
0
Способ 2. Использование макроса Visual Basic макроса
Предупреждение: Корпорация Майкрософт предоставляет примеры программирования только для иллюстрации без гарантии, выраженной или подразумеваемой. Это относится и не только к подразумеваемой гарантии пригодности и пригодности для определенной цели. В этой статье предполагается, что вы знакомы с языком программирования, который демонстрируется, и средствами, используемыми для создания и от debug procedures. Инженеры службы поддержки Майкрософт могут объяснить функциональные возможности конкретной процедуры. Однако они не будут изменять эти примеры, чтобы обеспечить дополнительные функциональные возможности или процедуры по построению в необходимом порядке.
Чтобы использовать макрос Visual Basic для сравнения данных в двух столбцах, с помощью следующих действий:
-
Запустите Excel.
-
Нажмите ALT+F11, чтобы запустить Visual Basic редактора.
-
В меню Вставка выберите Модуль.
-
Введите следующий код на листе модуля:
Sub Find_Matches() Dim CompareRange As Variant, x As Variant, y As Variant ' Set CompareRange equal to the range to which you will ' compare the selection. Set CompareRange = Range("C1:C5") ' NOTE: If the compare range is located on another workbook ' or worksheet, use the following syntax. ' Set CompareRange = Workbooks("Book2"). _ ' Worksheets("Sheet2").Range("C1:C5") ' ' Loop through each cell in the selection and compare it to ' each cell in CompareRange. For Each x In Selection For Each y In CompareRange If x = y Then x.Offset(0, 1) = x Next y Next x End Sub
-
Нажмите ALT+F11, чтобы вернуться к Excel.
-
Введите в качестве примера следующие данные (оставьте столбец B пустым):
A
B
C
1
1
3
2
2
5
3
3
8
4
4
2
5
5
0
-
-
Выберем ячейку от A1 до A5.
-
В Excel 2007 и более поздних версиях Excel выберите вкладку Разработчик, а затем в группе Код выберите макрос.
Примечание: Если вкладка Разработчик не отключается, возможно, ее нужно включить. Для этого выберите Файл > параметры > настроитьленту , а затем выберите вкладку Разработчик в поле настройки справа.
-
Щелкните Find_Matches, а затем нажмите кнопку Выполнить.
Повторяющиеся числа отображаются в столбце B. Совпадающие числа будут поместиться рядом с первым столбцом, как показано ниже.
A
B
C
1
1
3
2
2
2
5
3
3
3
8
4
4
2
5
5
5
0
Нужна дополнительная помощь?
Доброго времени суток, уважаемые форумчане!
Не могли бы вы подсказать, направить меня в нужном направлении.
Имеется таблица, с данным, в ячейках A1-An хранятся разные имена, некоторые из них повторяются. Подскажите пожалуйста, каким образом можно организовать подсчет каждого повторяющегося имени в таблице?
Тоесть сколько раз повторилось каждое имя.
Заранее спасибо за ответ.
8 ответов
13K
12 января 2007 года
Ser Artur
5 / / 06.10.2005
=COUNTIF(A1:A6,»Artur»)
405
12 января 2007 года
Dmitrii
554 / / 16.12.2004
Имеется таблица, с данным, в ячейках A1-An хранятся разные имена, некоторые из них повторяются. Подскажите пожалуйста, каким образом можно организовать подсчет каждого повторяющегося имени в таблице?
Тоесть сколько раз повторилось каждое имя.
Если инструментом решения должен служить макрос, а не функции рабочего листа, то алгоритм может быть таким:
— заводим массив для регистрации уникальных вариантов имён и массив счётчиков для них;
— организуем цикл по заданному диапазону ячеек для перебора всех значений;
— для каждого значения выполняем проверку наличия его в массиве уникальных имён (опять же в цикле); если проверяемое имя уже встречается в массиве, то увеличиваем значение соответствующего счётчика, если — не встречается, то добавляем его в массив и создаём очередной счётчик;
— нужным образом организуем вывод результатов (в окно сообщений, в файл, на лист и т.п.).
Если задача не учебная, то рекомендую использовать возможности объекта Dictionary из состава WSH. Вот пример:
Код:
Sub Example()
Dim dictNames As Object, arrKeys
Dim curCell As Range, curName As String
Set dictNames = CreateObject(«Scripting.Dictionary»)
dictNames.CompareMode = 1
For Each curCell In Range(«a1:a6»)
curName = curCell.Value
If dictNames.Exists(curName) Then
dictNames.Item(curName) = dictNames.Item(curName) + 1
Else
dictNames.Add curName, 1
End If
Next curCell
arrKeys = dictNames.Keys
For i = 0 To dictNames.Count — 1
MsgBox arrKeys(i) & «: » & dictNames.Item(arrKeys(i))
Next
End Sub
267
12 января 2007 года
Cutty Sark
1.2K / / 17.10.2002
Доброго времени суток, уважаемые форумчане!
Не могли бы вы подсказать, направить меня в нужном направлении.
Имеется таблица, с данным, в ячейках A1-An хранятся разные имена, некоторые из них повторяются. Подскажите пожалуйста, каким образом можно организовать подсчет каждого повторяющегося имени в таблице?
Тоесть сколько раз повторилось каждое имя.
Заранее спасибо за ответ.
Прекрасным средством для этого (и для много другого) является Сводная таблица (Pivot Table). Объяснения нужны?
2.1K
12 января 2007 года
Ariman
102 / / 20.10.2005
Pivot Table
Можно по подробней в общих чертах, если вас не затруднит?
По-поводу WSH, насколько я понимаю, это не ходит в состав Excel, все нужно реализовать в макросе.
Вопрос по-поводу алгоритма поиска имени. Вначале считваем первую ячейку, потом проверяем вторую, если не идентично, то пишем в массив второе имя, не пойму каким образом реализовать вот этот сам алгоритм сравнения всех данных.
267
13 января 2007 года
Cutty Sark
1.2K / / 17.10.2002
Так тебе обязательно это делать макросом? Макрос-то здесь необязателен. Можно с ним, можно без него…
И ещё скажи, какая у тебя версия Экселя, я имею в виду год и язык, чтобы мне не дублировать объяснения.
2.1K
13 января 2007 года
Ariman
102 / / 20.10.2005
Нужно макросом… 2003 офис, англ.вер
Объясните плз как на коде будет выглядеть, а то я никак не могу понять этот алгоритм.
405
16 января 2007 года
Dmitrii
554 / / 16.12.2004
Объясните плз как на коде будет выглядеть, а то я никак не могу понять этот алгоритм.
Вот один из вариантов:
Код:
Sub Example()
Dim curCell As Range
Dim arrNames() As String, arrNumNames() As Long
Dim resFind As Boolean
Dim curName As String
ReDim arrNames(1 To 1)
ReDim arrNumNames(1 To 1)
arrNames(1) = Range(«a1»).Value
arrNumNames(1) = 1
For Each curCell In Range(«a2:a6»)
curName = curCell.Value
i = LBound(arrNames)
Do
If StrComp(curName, arrNames(i), vbTextCompare) = 0 Then
arrNumNames(i) = arrNumNames(i) + 1
resFind = True
Else
i = i + 1
End If
Loop While resFind = False And i <= UBound(arrNames)
If resFind = False Then
ReDim Preserve arrNames(1 To i)
ReDim Preserve arrNumNames(1 To i)
arrNames(i) = curName
arrNumNames(i) = 1
Else
resFind = False
End If
Next curCell
For i = LBound(arrNames) To UBound(arrNames)
MsgBox arrNames(i) & «: » & arrNumNames(i)
Next i
End Sub
2.1K
17 января 2007 года
Ariman
102 / / 20.10.2005
Спасибо громное,щас будем пробовать.