Страницы: 1
RSS
Модификация макроса для массового поиска дублей, Макрос выделяет найденные дубли цветом, а нужно добавить чтоб ещё выделял словом справа от столбца.
 
Здравствуйте. bedvit, в теме https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=82834 написал отличный макрос для быстрого поиска дублей в больших массивах данных и выделения их цветом.
Код
Option Explicit'Автор Б. Виталий В. (bedvit)
'Макрос записан: 21/10/2016
'Редакция: 6 от 26/02/2020
'Действие: выделение разными цветами дубликатов в выделенных диапазонах
Sub select_replica() 'рабочий
Dim R As Range, Rf As Range, Rc As Range, i As Long, s(3) As Long, ac, t, x, cell
Dim Dict: Set Dict = CreateObject("Scripting.Dictionary")
Dim DictColor: Set DictColor = CreateObject("Scripting.Dictionary")
t = Timer
 
On Error Resume Next
If Selection.CountLarge = 1 Then
    Set Rf = ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas, 23)
    Set Rc = ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants, 23)
Else
    Set Rf = Intersect(ActiveSheet.UsedRange, Selection).SpecialCells(xlCellTypeFormulas, 23)
    Set Rc = Intersect(ActiveSheet.UsedRange, Selection).SpecialCells(xlCellTypeConstants, 23)
End If
On Error GoTo 0
 
With Application: .ScreenUpdating = 0: .DisplayAlerts = 0: .EnableEvents = 0: ac = .Calculation: .Calculation = -4135: .StatusBar = "BE: обработка данных...": End With
Set R = Rf: GoSub Go_
Set R = Rc: GoSub Go_
With Application: .ScreenUpdating = 1: .DisplayAlerts = 1: .EnableEvents = 1: .Calculation = ac: .StatusBar = False: End With
Debug.Print "select_replica = " & Timer - t
MsgBox "Выделено разных групп дубликатов (разными цветами): " & i, vbInformation
Exit Sub
     
Go_:
If Not R Is Nothing Then
    R.Interior.Pattern = Empty
    For Each cell In R.Cells
        If Dict.Exists(cell.Value) Then
            x = Dict.Item(cell.Value)
            If x(3) = 1 Then
                i = i + 1
                x(2) = 6740479
            cell.Interior.Color = x(2)
        Else
            s(0) = cell.Row
            s(1) = cell.Column
            s(3) = 1
            Dict.Add cell.Value, s
        End If
    Next
End If
Return
End Sub
 
Function Generate_nice_color() As Long
Dim R As Long, G As Long, B As Long
Do
    Randomize
    R = Int(Rnd * 256)
    G = Int(Rnd * 256)
    B = Int(Rnd * 256)
Loop Until R + G + B > 500 And R + G + B < 700
Generate_nice_color = RGB(R, G, B)
End Function

Иногда при сравнении больших массивов, на сотни тысяч ячеек, может быть всего несколько дублей, и их не получается найти через стандартный фильтр эксель.
Вопрос можно ли усовершенствовать макрос так чтобы, он после поиска дублей, правее сравниваемого столбца, напротив ячейки с залитым цветом дублем, писал слово дубль.
Пример ищем дубли в столбце В:В, макрос их нашёл и в столбце С:С напротив дублей написал слово Дубль.
Изменено: zvolkz - 21.06.2022 14:52:04
 
zvolkz, здравствуйте. Я бы создал таблицу-отчёт
Скрины, Файл и Код
    • Если выделена одна ячейка, то будет использована вся рабочая область листа. В противном случае - только выделение.
    • Ошибки, а также пустые и логические значения игнорируются.
    • Значения преобразуются в текстовый вид, поэтому 1 и "1" будут считаться одним "1" ключом. Если не надо, то заменить в начале кода v$ на v.
    • Регистр учитывается, поэтому "Вася" и "вася" - это разные ключи. Если нужно игнорировать, то заменить v = arr(r, c) на v = LCase$(arr(r, c)). В список, в таком случае, будут выведены ключи (значения) в нижнем регистре.
    • В отчёте (уникальный список всех значений) присутствуют как дубликаты, так и уникальные значения (столбец Count - количество вхождений значения).

При необходимости полученные блоки строк адресов (перечень ячеек с одним и тем же значением) можно быстро закрасить разными цветами.

P.S.:
    Функция Generate_nice_color() не гарантирует уникальности полученного цвета, поэтому разные группы дубликатов могут быть окрашены одинаковым цветом.
Впрочем, у вас в макросе она и не используется (тогда зачем она)  :)
Изменено: Jack Famous - 21.06.2022 18:15:10
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Впрочем, у вас в макросе она и не используется (тогда зачем она)
А она и не нужна, макрос всё красит в цвет похожий на жёлтый для удобства фильтрации.
Огромное спасибо Вам за проделанную работу, очень круто сделано, но в реальной задаче нужен именно макрос. Меня старый макрос устраивает, но оказалось что когда из 240 000 ячеек всего 9 дублей и машина их красит, то фильтр эксель не может отфильтровать по цвету, из-за этого эти дубли не вычленить.

Как вариант: может можно новый код написать что если в выделенном диапазоне ячейка покрашена в цвет 6740479 то напротив неё, правее столбца пишет слово дубль.
Ігор Гончаренко, написал вот такой код который красит ячейки
Код
Sub FillB2s()
  Dim ws As Worksheet
  For Each ws In Worksheets
    If ws.[b2] <> 1 Then ws.[b2].Interior.Color = 255
  Next
End Sub

я думаю можно сделать наоборот, но не знаю и не понимаю как прописать диапазоны сравнения, а не точные координаты ячеек как у Игоря.  
 
Цитата
zvolkz: очень круто сделано, но в реальной задаче нужен именно макрос
а у меня что? :D
    Не понимаю, чем не устраивает и что вам даст вывод в соседнюю ячейку но можно просто заменить строку "вашего" кода №38: cell.Interior.Color = x(2) на cell.Interior.Color = x(2): cell.Offset(0,1).Value2="ДУБЛЬ"
Изменено: Jack Famous - 21.06.2022 18:53:52
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
написал:
Не понимаю, чем не устраивает и что вам даст вывод в соседнюю ячейку
Это позволяет с помощью формул делать расчёты. До того как появилась проблема с фильтрами, я в ручную выбирал фильтр по цвету, а потом сам прописывал слово дубль напротив цветных ячеек
Ещё раз благодарю за помощь, Ваша таблица будет очень полезной, но других задачах.  
 
zvolkz, пожалуйста)
Ваша задача, уверен, решается и без макроса от бедвита - гораздо проще и быстрее, но вы ведь решили, что пример не нужен, а нужно именно "модифицировать" макрос, который изначально вообще для другого создан  :D
Изменено: Jack Famous - 21.06.2022 19:10:09
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, есть такое).
Изначально нужно было вот такую формулу
Код
=СЧЁТЕСЛИ(D:D;D2)>1

сделать в макрос, потому что на сотнях тысяч ячеек она считается часами. В итоге поиски на форуме вывели меня на тему с макросом бедвита, который всё обрабатывал за минуты, 743 000 ячеек минуты за 3 плюс минус.  
Изменено: zvolkz - 21.06.2022 19:23:24
 
zvolkz, создайте новую тему с примером и всё будет)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх