Vba excel найти дубликаты

Поиск повторяющихся значений (дубликатов) в одном из столбцов таблицы 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 Желтый

0 / 0 / 0

Регистрация: 24.05.2008

Сообщений: 4

1

19.01.2009, 15:57. Показов 40057. Ответов 8


Студворк — интернет-сервис помощи студентам

Регистрация: 19.01.2009
Сообщения: 2
Репутация:10
поиск макросом дубликатов в таблице эксель
Приветствую

появилась необходимость поиска повторяющихся улиц с номерами домов в таблице эксель с помощью макроса

Итак есть столбец «улица», рядом столбец «дом». Есть еще другие Столбцы в которых есть информация.
Если есть 2 записи в которых улица и номер дома идентичны, то подсветить красным цветом чтобы менеджер мог удалить лишнюю запись.
Так как дубликатов быть не должно.
Таблица состоит из 20 000! записей(строк)

Как можно было бы организовать алгоритм обхода так, чтобы это работало максимально производительно(быстро)

во вложении к посту
тестовая база на 6000 записей + мой макрос который жутко вешает EXCEL



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

я в макросах не сильна, но эту задачу можно решить еще вот так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub check()
 
a = InputBox("введите количетсво записей")
 
For x = 3 To a
    If Cells(x, 4).Value = 1 Then GoTo d
    For y = x + 1 To a
        If Cells(x, 1).Value = Cells(y, 1).Value And Cells(x, 2).Value = Cells(y, 2).Value Then '
            'Cells(у, 1).Select
            'Selection.Interior.ColorIndex = 3
            Cells(y, 4).Value = 1
        End If
    Next y
d:
Next x
End Sub

по такому алгоритму у меня расчет занял 22 минуты 12 секунд. не знаю быстрее это или медленее чем у Вас, но мало ли… м.б. пригодится.

если доступна сотировка, то есть более быстрый и простой механизм, только он делается не макросом, а формулой. сортируем сначала по а, затем по б и в пустой столбец во вторую строку забиваем формулу «=если((A2=A3)*И(B2=B3);1;»»)». растягиваем формулу до конца.
в результате получаем единички напротив повторов.
чисто теоретически все это можно загнать в макрос



0



32 / 32 / 4

Регистрация: 29.12.2008

Сообщений: 75

21.01.2009, 18:19

4

Loter. Ты прав на все 100%. Однако вся прелесть макросов — это автоматизация твоих действий.

Представь, что тебе каждый раз после ввода новых данных необходимо будет сначала отсортировать таблицу, потом выбрать специальный столбец, куда можно будет ввести предложенную тобой формулу с ЕСЛИ, растянуть ее (на несколько тысяч записей). Потом найти все строки, в которых твоя формула дает 1 и, наконец, выделив их, залить красным цветом.

У-Ф-Ф-Ф… Даже рука устала писать. Гораздо проще все это проделать одним кликом по кнопке, который присвоен специальный макрос.

Кстати.
Твой вариант с перебором ячеек хорош, но требует много времени для большого количества записей, в то время как в Excell уже встроен достаточно быстрый механизм сортировки.



0



loter

2 / 2 / 0

Регистрация: 16.01.2009

Сообщений: 11

22.01.2009, 18:01

5

хм….

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
Sub nnn()
 
'проводим сортировку примерно так
    Columns("A:B").Select
    Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Key2:=Range("B2") _
        , Order2:=xlAscending, Header:=xlGuess, OrderCustom:=1, MatchCase:= _
        False, Orientation:=xlTopToBottom, DataOption1:=xlSortNormal, DataOption2 _
        :=xlSortTextAsNumbers
        
'находим последнюю запись
    Range("A2").Select
    Selection.End(xlDown).Select
    x = ActiveCell.Row
    
'забиваем формулу если
    Cells(x, 100).Select
    ActiveCell.FormulaR1C1 = _
        "=IF((RC[-99]=R[1]C[-99])*AND(RC[-98]=R[1]C[-98]),""повтор"","""")"
    Selection.Copy
    Range(Selection, Selection.End(xlUp)).Select
    ActiveSheet.Paste
 
'заливаем ячейки
    For y = 1 To x
        If Cells(y, 100).Value = "повтор" Then
            Cells(y, 1).Select
            Selection.Interior.ColorIndex = 3
        End If
    Next y
    
'и фильтруем по повторам
    Columns("CV:CV").Select
    'Selection.AutoFilter
    Selection.AutoFilter Field:=1, Criteria1:="повтор"
 
'поднимаемся вверх чтобы пользователь всего этого не видел
    Selection.End(xlUp).Select
    Selection.End(xlToLeft).Select
End Sub

на базу в 6000 заняло меньше 5 секунд
всё это дело можно завязать на сочетание клавиш типа ctrl+w или конпку



0



maximus09

32 / 32 / 4

Регистрация: 29.12.2008

Сообщений: 75

23.01.2009, 17:57

6

Не знаю как bloogrox, а я результатом в общем и целом удовлетворен.

Единственное, на что нужно обратить внимание — это то, что сейчас программа использует дополнительный столбец книги Excell для того чтобы ввести формулу

Visual Basic
1
IF((RC[-99]=R[1]C[-99])*AND(RC[-98]=R[1]C[-98]),""повтор"","""")"

Это не всегда хорошо. Поиск можно осуществить простым перебором ячеек, не выводя никакой дополнительной информации на листы книги 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. — СПб.: БХВ-Петербург, 2002.

Кстати, там данный пример ручной с сортировкой описан в подробностях (что, какие опции в окне параметров сортировки нужно выбирать, зачем нужно выделять всю таблицу прежде чем производить сортировку и т.п.). Очень рекомендую книгу. Сам учился по ней. Но, стоит сказать, что она целиком посвящена 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

Цитата
Джек Восмеркин: Поиск дубликатов и пустых ячеек

файла нет — поэтому ловите VBA (макрос) (для значений <= 255 символов)
xl дома пока отсутствует — тестирование за вами

Код
Sub ПоискПустыхИДублей ()
dim rng as range, cl as range, bad&
set rng=selection

bad=vbred

   for each cl in rng
      if len(cl)=0 or application.worksheetfunction.countif(rng,cl) <>1 then cl.interior.color=bad
   next cl

аргументы функции могут быть другие, я имел ввиду — CountIf ([диапазон], [критерий]) — измените, в случае моей ошибки…
bad — код цвета, меняйте при необходимости, сейчас он «классический» красный и очень неудобный для зрительного восприятия.

Изменено: Jack Famous09.10.2018 17:25:58

Skip to content

На чтение 3 мин. Просмотров 4.1k.

Что делает макрос: Всегда хотел выделить значения дубликатов в диапазоне. Макрос в этом разделе делает именно это. Есть много ручных способов найти и выделить дубликаты — способы, включающие формулы, условное форматирование, сортировку и т.д. Тем не менее, все эти методы требуют ручной настройки и определенного уровня обслуживания по мере изменения данных.
Этот макрос упрощает задачу, что позволяет найти и выделить дубликаты в ваших данных с помощью щелчка мыши.

Содержание

  1. Как макрос работает
  2. Код макроса
  3. Как этот код работает
  4. Как использовать

Как макрос работает

Этот макрос перечисляет ячейки в целевом диапазоне, используя оператор 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. На шаге 1 объявляются две переменные объекта Range, одна из которых называется MyRange для хранения всей цели диапазона, а другая называется MyCell для хранения каждой ячейки в диапазоне.
  2. Шаг 2 заполняет переменную MyRange целевым диапазоном. В этом примере мы используем выбранный диапазон — диапазон, который был выбран в электронной таблице. Вы можете легко установить переменную MyRange для определенного диапазона, например Range («A1: Z100»). Кроме того, если ваша цель — именованный диапазон, вы можете просто ввести его имя: Range («MyNamedRange»).
  3. Шаг 3 макрос начинает проходить по каждой ячейке в целевом диапазоне, активируя каждую ячейку.
  4. Объект WorksheetFunction позволяет нам запускать многие из Excel функции электронных таблиц в VBA. Шаг 4 использует объект WorksheetFunction для запуска Функция СЧЕТЕСЛИ в VBA.
    В этом случае мы рассчитываем, сколько раз значение активной ячейки (MyCell.Value) найдено в заданном диапазоне (MyRange). Если выражение СЧЕТЕСЛИ оценивается больше 1, макрос изменяет цвет ячейки.
  5. Шаг 5 возвращается к следующей ячейке. После активации всех ячеек в целевом диапазоне макрос заканчивается.

Как использовать

Для реализации этого макроса, вы можете скопировать и вставить его в стандартный модуль:

  1. Активируйте редактор Visual Basic, нажав ALT + F11.
  2. Щелкните правой кнопкой мыши имя проекта / рабочей книги в окне проекта.
  3. Выберите Insert➜Module.
  4. Введите или вставьте код.

Skip to content

VBA find duplicate values in a column

Home » VBA » VBA find duplicate values in a column

  • VBA find duplicates in Column

VBA find duplicate values in a column Excel Macros Examples Codes: to find all duplicate records in a column in MS Excel 2003, 2007, 2010, 2013. We will also see the practical VBA example for finding the duplicates in a Column.

VBA find duplicates in Column

VBA code to Remove Duplicates in ListBox

Here is the Example VBA syntax and Example VBA Macro code to find Duplicates in a Column in Excel. This will help you to know how to find duplicate records in a column using VBA.

VBA find Duplicates in Column: Procedure

Following is the VBA Syntax and sample VBA macro command to find duplicates in a Column of Worksheet using VBA. In this method we loop through all the records and identify the duplicates using VBA.

VBA Find Duplicates in a Column: Examples

The following Excel VBA macro code is to find duplicate values in a column. This VBA macro will loop through the all the items in the first column and identify the duplicates using Match Spreadsheet Function. Here the logic is, the number is unique if the match index equals to the current processing row number. Otherwise it will be duplicate, it will print the “duplicate” in the second column.

Sub sbFindDuplicatesInColumn()
    Dim lastRow As Long
    Dim matchFoundIndex As Long
    Dim iCntr As Long
    lastRow = Range("A65000").End(xlUp).Row

    For iCntr = 1 To lastRow
    If Cells(iCntr, 1) <> "" Then
        matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0)
        If iCntr <> matchFoundIndex Then
            Cells(iCntr, 2) = "Duplicate" 
       End If
    End If
    Next
End Sub 

Instructions to run the VBA Macro code to find duplicates in a Column

Please follow the below steps to execute the VBA code to delete duplicates in Column.

  • Step 1: Open any Excel workbook
  • Step 2: Press Alt+F11 – This will open the VBA Editor
  • Step 3: Insert a code module from then insert menu
  • Step 4: Copy the above code and paste in the code module which have inserted in the above step
  • Step 5: Enter some data values in Column 1. Make sure that you have some duplicate items in the data for testing purpose
  • Now press F5 to Execute the macro and test the code

Now you can observe the code is loop thronging all the items in the column 1. And identifying the duplicates and printing the label as “Duplicate” in the Column B if the value is repeating.

Explained VBA Code to Find Duplicates in A Column

Starting Macro program and sub procedure to write VBA code to find duplicate records in a Worksheet Column.

  • Declaring the lastRow variable as Long to store the last row value in the Column1
  • Declaring the variable MatchFoundIndex is to store the match index values of the given value
  • Declaring the variable iCntr is to loop through all the records in the column 1 using For loop
  • Finding the last row in the Column 1
  • looping through the column1
  • Checking if the cell is having any item, skipping if it is blank.
  • Getting match index number for the value of the cell
  • If the match index is not equals to current row number, then it is a duplicate value
  • Printing the label in the column B

Here is the commented VBA Macro code, explained the procedure by each statement.

Sub sbFindDuplicatesInColumn_C()
'Declaring the lastRow variable as Long to store the last row value in the Column1
    Dim lastRow As Long

'matchFoundIndex is to store the match index values of the given value
    Dim matchFoundIndex As Long

'iCntr is to loop through all the records in the column 1 using For loop
    Dim iCntr As Long

'Finding the last row in the Column 1
    lastRow = Range("A65000").End(xlUp).Row

'looping through the column1
    For iCntr = 1 To lastRow
        'checking if the cell is having any item, skipping if it is blank.
        If Cells(iCntr, 1) <> "" Then
            'getting match index number for the value of the cell
            matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0)            
            'if the match index is not equals to current row number, then it is a duplicate value
            If iCntr <> matchFoundIndex Then
                'Printing the label in the column B
                Cells(iCntr, 2) = "Duplicate" 
            End If
        End If
    Next
End Sub 
Effortlessly Manage Your Projects and Resources
120+ Professional Project Management Templates!

A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.

Save Up to 85% LIMITED TIME OFFER
Excel VBA Project Management Templates
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates

Excel Pack
50+ Excel PM Templates

PowerPoint Pack
50+ Excel PM Templates

MS Word Pack
25+ Word PM Templates

Ultimate Project Management Template

Ultimate Resource Management Template

Project Portfolio Management Templates

Related Posts

  • VBA code to Remove Duplicates in ListBox
    • VBA find Duplicates in Column: Procedure
    • VBA Find Duplicates in a Column: Examples
      • Instructions to run the VBA Macro code to find duplicates in a Column
      • Explained VBA Code to Find Duplicates in A Column

VBA Reference

Effortlessly
Manage Your Projects

120+ Project Management Templates

Seamlessly manage your projects with our powerful & multi-purpose templates for project management.

120+ PM Templates Includes:

8 Comments

  1. Sohail
    May 16, 2015 at 3:49 PM — Reply

    Great explanation…. U People really God ‘s Own Creation

    Thanks A Lot

    Sohail Imran

  2. Suresh
    August 25, 2016 at 8:57 PM — Reply

    Hi Team,

    I have a question : i have given the some count in one of excel cell, now i need to find that data input cell in vba coding. could you please advise how to write this coding.

    Regards,
    Suresh

  3. siamak mahdikar
    February 1, 2017 at 2:51 AM — Reply

    Hi ,
    Thanks a lot ,
    I am from Iran , so I do not speak english very vell . excuse me .
    I have one question .
    How I can change column B to each coloumn ? Can I set this macro to any column ? for example run macro ic column E and F ?
    please help me .

  4. iel
    February 5, 2017 at 2:38 AM — Reply

    what if i want only find duplicates for all the same that i input to the textbox in userform

    i hope this problem have a solution

    thank you in advance

  5. Kurt N.
    February 27, 2020 at 1:48 AM — Reply

    Try this: (will highlight duplicates in yellow)

    Sub FindDuplicateValuesInRange()
    Dim cl, rng As Range

    Set rng = Range(“A1:A” & Cells(Rows.Count, “A”).End(xlUp).Row)

    For Each cl In rng
    If WorksheetFunction.CountIf(rng, cl.Value) > 1 Then
    cl.Interior.Color = vbYellow
    End If
    Next
    End Sub

  6. Bhojraj Timsina
    September 20, 2020 at 9:50 AM — Reply

    How to prevent dublicating values in this user entries form?

    Private Sub CommandButton1_Click()
    Dim y As Worksheet
    Dim X As Long
    Set y = Sheet1

    X = y.Range(“A” & Rows.Count).End(xlUp).Row
    With y
    .Cells(X + 1, “A”).Value = TextBox1.Value
    .Cells(X + 1, “B”).Value = TextBox2.Value
    .Cells(X + 1, “C”).Value = TextBox3.Value
    .Cells(X + 1, “D”).Value = TextBox6.Value
    .Cells(X + 1, “E”).Value = TextBox7.Value
    .Cells(X + 1, “F”).Value = TextBox8.Value
    .Cells(X + 1, “G”).Value = TextBox22.Value
    .Cells(X + 1, “I”).Value = TextBox23.Value
    .Cells(X + 1, “J”).Value = TextBox24.Value
    .Cells(X + 1, “K”).Value = TextBox25.Value
    .Cells(X + 1, “L”).Value = TextBox26.Value
    .Cells(X + 1, “M”).Value = TextBox27.Value
    .Cells(X + 1, “N”).Value = TextBox28.Value
    .Cells(X + 1, “O”).Value = TextBox29.Value
    .Cells(X + 1, “P”).Value = TextBox30.Value
    .Cells(X + 1, “Q”).Value = TextBox31.Value
    .Cells(X + 1, “R”).Value = TextBox32.Value
    .Cells(X + 1, “S”).Value = TextBox33.Value
    .Cells(X + 1, “T”).Value = TextBox34.Value
    .Cells(X + 1, “H”).Value = TextBox36.Value

    End With
    ‘clear tha data
    TextBox1.Text = ”
    TextBox2.Text = ”
    TextBox3.Text = ”
    TextBox6.Text = ”
    TextBox7.Text = ”
    TextBox8.Text = ”
    TextBox23.Text = ”
    TextBox24.Text = ”
    TextBox25.Text = ”
    TextBox26.Text = ”
    TextBox27.Text = ”
    TextBox28.Text = ”
    TextBox29.Text = ”
    TextBox30.Text = ”
    TextBox31.Text = ”
    TextBox32.Text = ”
    TextBox33.Text = ”
    TextBox34.Text = ”
    TextBox22.Text = ”
    TextBox36.Text = ”
    Unload Me
    UserForm2.Show
    End Sub

  7. Marta
    November 13, 2020 at 9:40 PM — Reply

    Hi, i have data set with name and few entries under one name, table will be populated vis user form but i will need have a code that will run checks under each name to see if have more then 3 entries in whole data base and notify user of this . Any ideas?

  8. Subhash N
    November 20, 2020 at 10:58 PM — Reply

    Hi
    I have requirement where in column A I have list of names say
    A
    B
    C
    A
    A
    Here I need to change the duplicate names to
    A
    B
    C
    A_1
    A_2
    Like above can someone please help me

Effectively Manage Your
Projects and  Resources

With Our Professional and Premium Project Management Templates!

ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.

We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.

Project Management
Excel VBA

Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.

Analysistabs Logo

Page load link

VBA Projects With Source Code

3 Realtime VBA Projects
with Source Code!

Take Your Projects To The Next Level By Exploring Our Professional Projects

Go to Top

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. Использование формулы на этом этапе

  1. Начните Excel.

  2. На новом примере введите следующие данные (оставьте столбец B пустым):

    A

    B

    C

    1

    1

    3

    2

    2

    5

    3

    3

    8

    4

    4

    2

    5

    5

    0

  3. Введите в ячейку B1 следующую

    формулу:=IF(ISERROR(MATCH(A1,$C$1:$C$5,0)),»»,A1)

  4. Выберем ячейку С1 по B5.

  5. В 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 для сравнения данных в двух столбцах, с помощью следующих действий:

  1. Запустите Excel.

  2. Нажмите ALT+F11, чтобы запустить Visual Basic редактора.

  3. В меню Вставка выберите Модуль.

  4. Введите следующий код на листе модуля:

    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

  5. Нажмите ALT+F11, чтобы вернуться к Excel.

    1. Введите в качестве примера следующие данные (оставьте столбец B пустым):
       

      A

      B

      C

      1

      1

      3

      2

      2

      5

      3

      3

      8

      4

      4

      2

      5

      5

      0

  6. Выберем ячейку от A1 до A5.

  7. В Excel 2007 и более поздних версиях Excel выберите вкладку Разработчик, а затем в группе Код выберите макрос.

    Примечание: Если вкладка Разработчик не отключается, возможно, ее нужно включить. Для этого выберите Файл > параметры > настроитьленту , а затем выберите вкладку Разработчик в поле настройки справа.

  8. Щелкните Find_Matches, а затем нажмите кнопку Выполнить.

    Повторяющиеся числа отображаются в столбце B. Совпадающие числа будут поместиться рядом с первым столбцом, как показано ниже.

    A

    B

    C

    1

    1

    3

    2

    2

    2

    5

    3

    3

    3

    8

    4

    4

    2

    5

    5

    5

    0

Нужна дополнительная помощь?

Вступление

В определенные моменты вы будете оценивать диапазон данных, и вам нужно будет найти дубликаты в нем. Для больших наборов данных существует ряд подходов, которые вы можете использовать, используя код VBA или условные функции. В этом примере используется простое условие if-then в течение двух вложенных циклов for-next для проверки того, равна ли каждая ячейка в диапазоне для любой другой ячейки в диапазоне.

Найти дубликаты в диапазоне

Следующие тесты варьируются от A2 до A7 для повторяющихся значений. Примечание. Этот пример иллюстрирует возможное решение в качестве первого подхода к решению. Быстрее использовать массив, чем диапазон, и можно использовать коллекции или словари или методы xml для проверки дубликатов.

    Sub find_duplicates()
' Declare variables
  Dim ws     As Worksheet               ' worksheet
  Dim cell   As Range                   ' cell within worksheet range
  Dim n      As Integer                 ' highest row number
  Dim bFound As Boolean                 ' boolean flag, if duplicate is found
  Dim sFound As String: sFound = "|"    ' found duplicates
  Dim s      As String                  ' message string
  Dim s2     As String                  ' partial message string
' Set Sheet to memory
  Set ws = ThisWorkbook.Sheets("Duplicates")

' loop thru FULLY QUALIFIED REFERENCE
  For Each cell In ws.Range("A2:A7")
    bFound = False: s2 = ""             ' start each cell with empty values
 '  Check if first occurrence of this value as duplicate to avoid further searches
    If InStr(sFound, "|" & cell & "|") = 0 Then
    
      For n = cell.Row + 1 To 7           ' iterate starting point to avoid REDUNDANT SEARCH
        If cell = ws.Range("A" & n).Value Then
           If cell.Row <> n Then        ' only other cells, as same cell cannot be a duplicate
                 bFound = True             ' boolean flag
              '  found duplicates in cell A{n}
                 s2 = s2 & vbNewLine & " -> duplicate in A" & n
           End If
        End If
       Next
     End If
   ' notice all found duplicates
     If bFound Then
         ' add value to list of all found duplicate values
         ' (could be easily split to an array for further analyze)
           sFound = sFound & cell & "|"
           s = s & cell.Address & " (value=" & cell & ")" & s2 & vbNewLine & vbNewLine
     End If
   Next
' Messagebox with final result
  MsgBox "Duplicate values are " & sFound & vbNewLine & vbNewLine & s, vbInformation, "Found duplicates"
End Sub

В зависимости от ваших потребностей пример может быть изменен — ​​например, верхний предел n может быть значением строки последней ячейки с данными в диапазоне, или действие в случае условия Истина If может быть отредактировано для извлечения дубликата ценность в другом месте. Однако механика рутины не изменилась.

Want to find duplicates in a column in excel and want to popup a msgbox upon finding even 1 duplicate and it shouldn’t keep on popping messages if it finds more than one duplicate.

Also, if i can use two column cell values and use that together to find duplicates, this would be also helpful.

  Sub ColumnDuplicates()
    Dim lastRow As Long
    Dim matchFoundIndex As Long
    Dim iCntr As Long
    lastRow = Range("A65000").End(xlUp).Row

    For iCntr = 1 To lastRow
    If Cells(iCntr, 1) <> "" Then
        matchFoundIndex = WorksheetFunction.Match(Cells(iCntr, 1), Range("A1:A" & lastRow), 0)
        If iCntr <> matchFoundIndex Then
            MsgBox ("There are duplicates in Column A")
        End If
    End If
    Next
    MsgBox ("No Duplicates in Column A")
End Sub

Expecting to print message saying that column A has duplicates or does not have duplicates

Mathieu Guindon's user avatar

asked Jul 26, 2019 at 15:15

Zubair's user avatar

7

What about the use of EVALUATE?

Public Sub Test()

With ThisWorkbook.Sheets("Sheet1")
    lr = .Cells(.Rows.Count, "A").End(xlUp).Row
    If .Evaluate("=Max(countif(A1:A" & lr & ",A1:A" & lr & "))") > 1 Then
        MsgBox "Duplicates!"
    Else
        MsgBox "No Duplicates!"
    End If
End With

End Sub

Or, parameterized:

Public Sub Test(ByVal sheet As Worksheet, ByVal columnHeading As String)

With sheet
    lr = .Cells(.Rows.Count, columnHeading).End(xlUp).Row
    If .Evaluate("=Max(countif(" & columnHeading & "1:" & columnHeading & lr & "," & columnHeading & "1:" & columnHeading & lr & "))") > 1 Then
        MsgBox "Duplicates!"
    Else
        MsgBox "No Duplicates!"
    End If
End With

End Sub

Now you can invoke it like this:

Test Sheet1, "A" ' find dupes in ThisWorkbook/Sheet1 in column A
Test Sheet2, "B" ' find dupes in ThisWorkbook/Sheet2 in column B
Test ActiveWorkbook.Worksheets("SomeSheet"), "Z" ' find dupes in "SomeSheet" worksheet of whatever workbook is currently active, in column Z

Mathieu Guindon's user avatar

answered Jul 26, 2019 at 15:37

JvdV's user avatar

JvdVJvdV

66.6k8 gold badges38 silver badges68 bronze badges

19

Throw your values in a dictionary

Sub ColumnDuplicates()
Dim lastRow As Long
Dim matchFoundIndex As Long
Dim iCntr As Long

lastRow = Range("A65000").End(xlUp).Row
Set oDictionary = CreateObject("Scripting.Dictionary")
For iCntr = 1 To lastRow
    If Cells(iCntr, 1) <> "" Then
        If oDictionary.Exists(Cells(iCntr, 1).Value) Then
            MsgBox ("There are duplicates in Column A")
            Exit Sub
        Else 
            oDictionary.Add Cells(iCntr, 1).Value, Cells(iCntr, 1).Value
        End If
    End If
Next
MsgBox ("No Duplicates in Column A")
End Sub

Mathieu Guindon's user avatar

answered Jul 26, 2019 at 15:23

Tim's user avatar

TimTim

2,6333 gold badges25 silver badges47 bronze badges

5

If you have Excel 2007+ then this will be faster. This code ran in 1 sec for 200k rows

Sub Sample()
    Debug.Print Now

    Dim ws As Worksheet
    Dim wsTemp As Worksheet

    Set ws = Sheet1

    Set wsTemp = ThisWorkbook.Sheets.Add

    ws.Columns(1).Copy wsTemp.Columns(1)

    wsTemp.Columns(1).RemoveDuplicates Columns:=1, Header:=xlNo

    If Application.WorksheetFunction.CountA(ws.Columns(1)) <> _
       Application.WorksheetFunction.CountA(wsTemp.Columns(1)) Then
        Debug.Print "There are duplicates in Col A"
    Else
        Debug.Print "duplicates found in Col A"
    End If

    Application.DisplayAlerts = False
    wsTemp.Delete
    Application.DisplayAlerts = True

    Debug.Print Now
End Sub

I used the below code to generate 200k records in Col A

Sub GenerateSampleData()
    Range("A1:A200000").Formula = "=Row()"
    Range("A1:A200000").Value = Range("A1:A200000").Value
    Range("A10000:A20000").Value = Range("A20000:A30000").Value
End Sub

Code execution

enter image description here

answered Jul 26, 2019 at 15:51

Siddharth Rout's user avatar

Siddharth RoutSiddharth Rout

146k17 gold badges206 silver badges250 bronze badges

Очень часто при работе c таблицами Excel возникают ситуации, в которых необходимо сравнить несколько списков, найти в них повторяющиеся значения и что-то с ними сделать.  Оптимальный способ поиска и обработки дубликатов должен быть выбран в зависимости от типа исходных данных и желаемого результата. Цель данной статьи — разобрать все возможные варианты обработки дубликатов в Excel в одной статье для того, чтобы читатель мог выбрать оптимальный вариант для любой ситуации.

Оглавление:

  • Выделение
    • Поиск и выделение повторяющихся значений ячеек в одном списке — условное форматирование
    • Поиск и выделение повторяющихся значений ячеек в нескольких списках — условное форматирование
    • Поиск и выделение повторяющихся значений ячеек — макрос Excel-VBA
    • Поиск и выделение повторяющегося текста внутри ячеек — макрос Excel VBA
  • Замена
    • Замена дублирующихся значений ячеек с помощью макроса Excel-VBA
    • Подстановка в другие таблицы
    • Функция ВПР (VLOOKUP)
    • Комбинация функций ИНДЕКС + ПОИСКПОЗ (INDEX+MATCH)+СЧЁТ()+ЕСЛИ()
  • Подсчёт
    • Посчитать количество повторений в одном списке
    • Сравнение двух списков используя формулу подсчёта повторений
    • Подсчёт количества повторений значений в строках с помощью макросов Excel-VBA
    • Функция СЧЁТЕСЛИ (COUNTIF)
  • Поиск
    • Поиск повторений значений в ячейках с помощью макроса Excel-VBA
    • Скрытие
    • Сортировка и фильтр
    • Скрытие строк с помощью макроса Excel-VBA
  • Удаление
    • Данные -> удалить дубликаты
    • Умные таблицы. Форматировать как таблицу -> удалить дубликаты

Функции в каждом разделе описаны в порядке возрастания их сложности и трудоемкости использования.


Выделение


Поиск и выделение повторяющихся значений ячеек в одном списке — условное форматирование

1. Выделить все значения в списке 

Образец списка с дубликатами Excel

2. Вкладка «Главная» -> Условное форматирование -> Правила выделения ячеек -> Повторяющиеся значения

Условное форматирование дубликатов в Excel

3. Выбрать необходимый формат (в данном случае выбран красный шрифт на светло-красном фоне)

Условное форматирование дубликатов в Excel

Результат:

Список Excel с дубликатами, выделенными с помощью условного форматирования

Если применить данное условное форматирование ко всему столбцу A, то все новые дубликаты, добавленные после строки 10 также будут отформатированы по заданному правилу.

Столбец с дубликатами, выделенными с помощью условного форматирования

Поиск и выделение повторяющихся значений ячеек в нескольких списках — условное форматирование

Сначала необходимо выделить столбцы (диапазоны ячеек) с дубликатами. Далее необходимо проделать действия, описанные в предидушем разделе начиная с шага 2.

 Списки с дубликатами, выделенными с помощью условного форматирования

Недостаток данного способа выделения дубликатов — визуально не определить, продублированы ли значения внутри каждого из списков, или между списками. В данном примере «малина» дублируется внутри списка 1, а «банан» и «груша» выделены потому что они продублированы между списками.

Для того, чтобы дублирование внутри списков воспринималось отдельно от дублирования между списков можно повторно использовать другое условное форматирование для каждого из столбцов по отдельности.

1. Выделяем первый столбец:

2. Вкладка «Главная» -> Условное форматирование -> Правила выделения ячеек -> Повторяющиеся значения

 Условное форматирование дубликатов в Excel

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)+СЧЁТ()+ЕСЛИ()

Если таблица, из которой мы хотим доставать значения для подстановки содержит дубликаты, то использование функции ВПР может не дать нужного результата, так как ВПР использует первое попавшееся совпадение и результат будет зависит от сортировки.


Подсчёт


Посчитать количество повторений в одном списке

Сравнение двух списков используя формулу подсчёта повторений

Подсчёт количества повторений значений в строках с помощью макросов Excel-VBA

Функция СЧЁТЕСЛИ (COUNTIF)


Поиск


Поиск повторений значений в ячейках с помощью макроса Excel-VBA


Скрытие


Сортировка и фильтр

Скрытие строк с помощью макроса Excel-VBA


Удаление


Данные -> удалить дубликаты

Умные таблицы. Форматировать как таблицу -> удалить дубликаты

Like this post? Please share to your friends:
  • Vba excel общая переменная
  • Vba excel найти все ячейки со значением
  • Vba excel обход ошибок
  • Vba excel найти все значения в диапазоне
  • Vba excel обращение к ячейке по индексу