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 Желтый

23 / 23 / 12

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

Сообщений: 88

1

Поиск одинаковых значений в столбце

26.09.2011, 14:41. Показов 23032. Ответов 11


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

Добрый день.

Не могу разобраться с одной задачей на Excel.

Дан одномерный массив, занесенный в столбец Excel. Необходимо найти количество повторений числа, но только того которое стоит раньше, чем другие числа имеющие повторения…


Например:

7
5
3
1
2
3
4
5
0
1

В итоге получается что необходимо посчитать сколько «

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

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

как вариант.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub n()
For i = 1 To 10
Cells(i, 2) = Application.WorksheetFunction.CountIf([a1:a10], Cells(i, 1))
Next i
For Each cel In [b1:b10]
If cel.Value > 1 Then
Cells(1, 5) = "Цифра " & Cells(cel.Row, 1) & " стоит первой в массиве "
Cells(2, 5) = "и повторяется " & Cells(cel.Row, 2) & " раз(a)"
Cells(3, 5) = "ее индекс в массиве " & cel.Row
Exit For
End If
Next cel
End Sub

Вложения

Тип файла: xls Подсчет повторов_1.xls (32.0 Кб, 362 просмотров)



1



Казанский

15136 / 6410 / 1730

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

Сообщений: 9,999

26.09.2011, 17:51

5

Можно так:

Visual Basic
1
2
3
4
5
6
7
8
Sub malenkaya()
Dim i&, j&, v()
On Error Resume Next
i = Cells(Rows.Count, 1).End(xlUp).Row
v = Evaluate("INDEX(COUNTIF(A1:A" & i & ",A1:A" & i & ")>1,)")
j = WorksheetFunction.Match(True, v, 0)
MsgBox "позиция: " & j & vbLf & "число: " & [A1].Cells(j)
End Sub



2



23 / 23 / 12

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

Сообщений: 88

26.09.2011, 19:18

 [ТС]

6

спасибо большое!!!

Добавлено через 3 минуты
извените за беспокойство, а можно узнать индексы всех повторяеммых чисел, или хотя-бы второй?

ну вроде индекс 1-ой 5 — 2
индекс 2-ой 5 — 8



0



19vitek

730 / 406 / 95

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

Сообщений: 756

26.09.2011, 19:29

7

Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub n()
For i = 1 To 10
Cells(i, 2) = Application.WorksheetFunction.CountIf([a1:a10], Cells(i, 1))
Next i
For Each cel In [b1:b10]
If cel.Value > 1 Then
Cells(1, 5) = "Цифра " & Cells(cel.Row, 1) & " стоит первой в массиве "
Cells(2, 5) = "и повторяется " & Cells(cel.Row, 2) & " раз(a)"
Cells(3, 5) = "ее индекс в массиве " & cel.Row
Exit For
End If
Next cel
For Each cel In [b1:b10]
If cel.Value > 1 Then Cells(cel.Row, 3) = cel.Row
Next cel
Cells(11, 3) = "Индексы повторяющихся елементов"
End Sub



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

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub n()
For i = 1 To 10
Cells(i, 2) = Application.WorksheetFunction.CountIf([a1:a10], Cells(i, 1))
Next i
For Each cel In [b1:b10]
If cel.Value > 1 Then
Cells(1, 5) = "Цифра " & Cells(cel.Row, 1) & " стоит первой в массиве "
Cells(2, 5) = "и повторяется " & Cells(cel.Row, 2) & " раз(a)"
Cells(3, 5) = "ее индекс в массиве " & cel.Row
temp = Cells(cel.Row, 1)
Exit For
End If
Next cel
[c:c].Clear
For Each cel In [b1:b10]
If cel.Value > 1 And Cells(cel.Row, 1) = temp Then Cells(cel.Row, 3) = cel.Row
Next cel
Cells(11, 3) = "Индексы цифры " & temp
End Sub



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 минут

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
Sub n()
For i = 1 To 10
Cells(i, 2) = Application.WorksheetFunction.CountIf([a1:a10], Cells(i, 1))
Next i
For Each cel In [b1:b10]
If cel.Value > 1 Then
Cells(1, 5) = "Цифра " & Cells(cel.Row, 1) & " стоит первой в массиве "
Cells(2, 5) = "и повторяется " & Cells(cel.Row, 2) & " раз(a)"
Cells(3, 5) = "ее индекс в массиве " & cel.Row
temp = Cells(cel.Row, 1)
Exit For
End If
Next cel
[c:c].Clear
For Each cel In [b1:b10]
If cel.Value > 1 And Cells(cel.Row, 1) = temp Then
Cells(cel.Row, 3) = cel.Row
k = k + 1
End If
If k = 2 Then
ind = cel.Row
Exit For
End If
Next cel
Cells(11, 3) = "Второй индекс цифры " & temp & "=" & ind
End Sub



1



23 / 23 / 12

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

Сообщений: 88

26.09.2011, 20:57

 [ТС]

12

Именно второй

Добавлено через 1 минуту
Большое Вам спасибо за помощь и терпение!!!



0



 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

Добрый день, уважаемые форумчане! В поиске есть аналогичные темы, но подходящего мне я не нашел. Суть проблемы: есть табличка ~200 тыс. строк на 60 столбцов. В столбце G — некий идентификатор id, он может быть уникальным, а может повторяться. Буду благодарен за помощь с помощью VBA найти и вырезать из данной таблицы строки с повторяющимися id и перенести их на другой лист.

Excel непознаваем как атом.

 

Возможно я не правильно понял задачу…. Но самый простой вариант
Выделяем столбец G, на вкладке Главная — выбираем условное форматирование —> Правила выделения ячеек —> Повторяющиеся значения (что бы все повторяющиеся ID подсвечивались)
Далее устанавливаем в столбце G фильтр —> Фильтр по цвету —> выбираем цвет повторения (красный по умолчанию).
Автоматом получили все повторяющиеся ID отфильтрованные, теперь мы просто их копируем и вставляем на другой лист.
Прошу простить, если не правильно понял задачу=)

 

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

https://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=1&TID=47173

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

mtts54, здравствуйте!
Не совсем понятно, как переносить… Просто все дубли, как описал Михаил Комиссаров? Уточните в файле примере конечный результат…

Изменено: Jack Famous15.08.2018 11:14:43

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

С помощью доп.столбца. Файл положить в папку С:1, на таблице ПКМ-обновить.

Неизлечимых болезней нет, есть неизлечимые люди.

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

Михаил Комиссаров

, автофильтр «видит» только 10 тыс. строк, поэтому этот прием не годится.

Jack Famous

, конечный результат в файле-примере таков: на Листе1 строк с подсвеченными id не должно быть — они должны появиться на другом, вставленном листе. В реальном файле из-за большого количества строк УФ неприменимо.

Excel непознаваем как атом.

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

TheBestOfTheBest

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

Excel непознаваем как атом.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

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). Файл заменён.

Прикрепленные файлы

  • Поиск повторов.xlsm (63.08 КБ)

Изменено: Jack Famous15.08.2018 15:07:53

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#9

15.08.2018 14:30:52

выполните этот макрос

Код
Sub RemoveDouble2NewSheet()
  Dim rg As Range: Set rg = Range(Cells(2, 7), Cells(Rows.Count, 7).End(xlUp))
  rg.Offset(0, 9).FormulaR1C1 = "=if(countif(r2c7:r" & rg.Rows.Count + 1 & "c7, rc7)>1,2,"""")"
  rg.Offset(0, 9).Value = rg.Offset(0, 9).Value
  Set rg = rg.Offset(0, 9).SpecialCells(xlCellTypeConstants, 1).EntireRow: Columns(16).Clear
  rg.Copy Worksheets.Add.Cells(1, 1):  rg.Delete: Columns(16).Clear
End Sub

при активном листе с данными

Изменено: Ігор Гончаренко15.08.2018 14:34:29

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

TheBestOfTheBest

Пользователь

Сообщений: 2366
Регистрация: 03.04.2015

Excel 2010 +PLEX +SaveToDB +PowerQuery

#10

15.08.2018 14:39:42

Цитата
mtts54 написал:
Честно говоря, я не понял, каким приемом Вы решили задачу. Спасибо за ответ.

Внешний запрос (Данные-Получение внешних данных…). Измените формулу в столбце Ключ =СЧЁТЕСЛИ($G$2:$G$348;G2), обновите таблицы как указано выше.

Изменено: TheBestOfTheBest15.08.2018 14:40:31

Неизлечимых болезней нет, есть неизлечимые люди.

 

кузя1972

Пользователь

Сообщений: 189
Регистрация: 10.12.2017

#11

15.08.2018 16:37:15

вариант макроса(не нашел как надо в исходном файл -примере),кнопки unic и очистка,лист1 добавлен вручную

Код
Sub unic()
     Dim i&, m&, j&, z, z1: z = Range("A2:O" & Range("A" & Rows.Count).End(xlUp).Row).Value
     ReDim z1(1 To UBound(z), 1 To UBound(z, 2))
 With CreateObject("scripting.dictionary"): .CompareMode = 1
 For i = 1 To UBound(z): .Item(z(i, 7)) = .Item(z(i, 7)) + 1: Next
 For i = 1 To UBound(z)
 If .Item(z(i, 7)) > 1 Then
   m = m + 1: For j = 1 To UBound(z, 2): z1(m, j) = z(i, j): Next
 End If
 Next
 Sheets("Лист1").Range("A1").Resize(m, UBound(z1, 2)).Value = z1
End With
End Sub

Прикрепленные файлы

  • example_16_08_2018_pl_повторы.xls (146.5 КБ)

Изменено: кузя197215.08.2018 16:37:30

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

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

Excel непознаваем как атом.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

mtts54, мы ждём (ну я точно жду фидбэк)  :D

Изменено: Jack Famous16.08.2018 10:15:51

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#14

16.08.2018 10:51:18

Вариант на массивах и словарях

Скрытый текст

«Все гениальное просто, а все простое гениально!!!»

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

Добрый день! Протестировал макрос от

Ігор Гончаренко

на реальном файле размером 31 колонка на 153 тыс.строк. В макросе в выражениях Offset(0, 9) заменил 9 на 25 и в Columns(16)  заменил 16 на 32. Макрос работал ок. 10 минут, нашел все 7696 повторов. Хотелось бы побыстрее, но… размер имеет значение. Спасибо! Остальные решения протестирую завтра.

Excel непознаваем как атом.

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

Попробовал на том же реальном файле макрос от

Jack Famous

. К сожалению, макрос где-то зациклился и после 20 минут ожидания я был вынужден остановить его выполнение :(  

Excel непознаваем как атом.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

#17

17.08.2018 11:45:00

mtts54, немного изменил принцип удаления строк из исходника — пробуйте

КОД

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

На том же реальном файле макрос

Nordheim

за 2 секунды нашел все повторы, вставил лист и скопировал повторы туда (правда, пару раз VBA ругнулся: не была объявлена переменная sht1 — это я поправил).  Но с исходного листа макрос повторы не удалил  :( . Тут я ничего поделать не смог  :cry:  . Очень надеюсь, что уважаемый  

Nordheim

 прочтет этот пост и подправит код :oops:  

Excel непознаваем как атом.

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

mtts54, вы бы выложили ссылку на файл реального объёма, но без конфиденциальных данных — тестить проще было бы

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#20

17.08.2018 12:27:31

В данном коде есть нюанс, таблица должна начинаться со второй строки, шапка таблицы на первой

Код
Option Explicit

 
Sub test()
'   ----------------------------------------------
    Dim dic As Object, ikey, rng As Range
    Dim i&, arr(), txt$, j%, x&, sht As Worksheet
'   ----------------------------------------------
    Application.DisplayAlerts = False
    Set dic = CreateObject("Scripting.Dictionary")
    On Error Resume Next
    Set sht = ThisWorkbook.Worksheets("Дубли")
    If Not sht Is Nothing Then sht.Delete
    On Error GoTo 0
    arr = sht1.UsedRange.Value
    For i = 2 To UBound(arr)
        txt = arr(i, 7)
        dic.Item(txt) = dic.Item(txt) + 1
    Next i
    For Each ikey In dic.Keys
        If dic.Item(ikey) = 1 Then dic.Remove (ikey)
    Next ikey
    x = 1
    For i = 1 To UBound(arr)
        txt = arr(i, 7)
        If dic.Exists(txt) Then
            If rng Is Nothing Then Set rng = sht1.Rows(i) Else Set rng = Union(rng, sht1.Rows(i))
            x = x + 1
            For j = 1 To UBound(arr, 2)
                arr(x, j) = arr(i, j)
            Next j
        End If
    Next i
    Set sht = ThisWorkbook.Worksheets.Add(after:=sht1)
    With sht
        .[a1].Resize(x, UBound(arr, 2)) = arr
        .Name = "Дубли"
        .Columns.AutoFit
    End With
    If Not rng Is Nothing Then rng.Delete
    Application.DisplayAlerts = True
End Sub

«Все гениальное просто, а все простое гениально!!!»

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#21

17.08.2018 12:36:19

Nordheim,  
Определите sht1    

Код
  Set sht1 = ThisWorkbook.Worksheets("Пример на форум")

при формировании листа Дубли я бы добавил первой строку

Код
.Range("K2:K" & x).NumberFormat = "@"

Изменено: Kuzmich17.08.2018 12:48:30

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

Excel непознаваем как атом.

 

kryptonets

Пользователь

Сообщений: 5
Регистрация: 20.01.2018

Я вижу,что нужен макрос. Но предложу другое решение. Надстройка PowerQuery. Выделить таблицу Ctrl+T, с заголовками.PowerQuery—>Из таблицы,диапазона.Главная—>Сохранять строки—>Сохранять дубликаты.Выгрузить.Готово)

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#24

17.08.2018 13:03:43

Цитата
Kuzmich написал:
Определите sht1

sht1 в файле это название листа в VBAProject, поэтому лист не объявлен, на кириллице неудобно было писать, поэтому переименовал по ходу написания кода

«Все гениальное просто, а все простое гениально!!!»

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#25

17.08.2018 13:05:09

Цитата
Kuzmich написал:
при формировании листа Дубли я бы добавил первой строку

С какой целью?

«Все гениальное просто, а все простое гениально!!!»

 

mtts54

Пользователь

Сообщений: 164
Регистрация: 10.09.2015

Nordheim

,  макрос (с учетом от

Kuzmich

) отработал немного дольше (это абсолютно не критично), повторы с исходного листа удалил. Спасибо!

kryptonets

, нужен именно макрос, т.к. таблица обрабатывается макросом (моим) и прерывать его для ручной работы неудобно. Тем не менее попробую Вашу идею — лишних знаний ведь не бывает, когда-нибудь пригодится. Спасибо.

Excel непознаваем как атом.

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#27

17.08.2018 13:17:04

Nordheim, написал

Цитата
С какой целью?

Просто на листе Дубли в столбце К появляются ячейки с янв.92 вместо 1-92

Изменено: Kuzmich17.08.2018 13:17:18

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#28

17.08.2018 13:18:40

Цитата
Kuzmich написал:
Просто на листе Дули в столбце К появляются ячейки с янв.92 вместо 1-92

А строка зачем?

«Все гениальное просто, а все простое гениально!!!»

 

Kuzmich

Пользователь

Сообщений: 7998
Регистрация: 21.12.2012

#29

17.08.2018 13:22:51

Я имел в виду этот кусок макроса

Код
    With sht
        .Range("K2:K" & x).NumberFormat = "@"
        .[a1].Resize(x, UBound(arr, 2)) = arr
        .Name = "Дубли"
        .Columns.AutoFit
    End With

Чтобы не было преобразования в дату

 

Nordheim

Пользователь

Сообщений: 3154
Регистрация: 18.04.2017

#30

17.08.2018 13:23:27

Наверно так более правильно.

Код
Sub test()
'   ----------------------------------------------
    Dim dic As Object, ikey, rng As Range, sht1 As Worksheet
    Dim i&, arr(), txt$, j%, x&, sht As Worksheet
'   ----------------------------------------------
    Application.DisplayAlerts = False
    Set dic = CreateObject("Scripting.Dictionary")
    On Error Resume Next
    Set sht = ThisWorkbook.Worksheets("Дубли")
    If Not sht Is Nothing Then sht.Delete
    On Error GoTo 0
    Set sht1 = Worksheets("имя листа")
    arr = sht1.UsedRange.Value
    For i = 2 To UBound(arr)
        txt = arr(i, 7)
        dic.Item(txt) = dic.Item(txt) + 1
    Next i
    For Each ikey In dic.Keys
        If dic.Item(ikey) = 1 Then dic.Remove (ikey)
    Next ikey
    x = 1
    For i = 1 To UBound(arr)
        txt = arr(i, 7)
        If dic.Exists(txt) Then
            If rng Is Nothing Then Set rng = sht1.Rows(i) Else Set rng = Union(rng, sht1.Rows(i))
            x = x + 1
            For j = 1 To UBound(arr, 2)
                arr(x, j) = arr(i, j)
            Next j
        End If
    Next i
    Set sht = ThisWorkbook.Worksheets.Add(after:=sht1)
    With sht
       .Range("K2:K" & x).NumberFormat = "@"
       .[a1].Resize(x, UBound(arr, 2)).Value = arr
        End With
        .Name = "Дубли"
        .Columns.AutoFit
    End With
    If Not rng Is Nothing Then rng.Delete
    Application.DisplayAlerts = True
End Sub

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

  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

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

Доброго времени суток, уважаемые форумчане!

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

Имеется таблица, с данным, в ячейках 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

Спасибо громное,щас будем пробовать.

Понравилась статья? Поделить с друзьями:
  • Vba excel объявление функции
  • Vba excel объявление массива
  • Vba excel объявление массив
  • Vba excel объявление книги
  • Vba excel объявление класса