Выделять дубликаты на листах пропускать первый экземпляр

#excel #vba

#excel #vba

Вопрос:

У меня есть следующий код, который выделяет дубликаты в столбце A на всех рабочих листах

 Sub Test()
    Dim idColl, dupAdd, ws As Worksheet, adColl As Collection, dic As Object, r As Range, c As Range
    Application.ScreenUpdating = False
        Set dic = CreateObject("Scripting.Dictionary")
        For Each ws In ThisWorkbook.Sheets
            For Each r In ws.Range("A1:A" amp; ws.Cells(Rows.Count, 1).End(xlUp).Row)
                If Not IsEmpty(r) Then
                    If Not dic.Exists(r.Value) Then
                        Set dic(r.Value) = New Collection
                    End If
                    dic(r.Value).Add GetFullAddress(r)
                End If
            Next r
        Next ws
        For Each idColl In dic
            Set adColl = dic(idColl)
            If adColl.Count >= 2 Then
                For Each dupAdd In adColl
                    Set c = Range(dupAdd)
                    c.Interior.ColorIndex = 3
                Next dupAdd
            End If
        Next idColl
    Application.ScreenUpdating = True
End Sub

Private Function GetFullAddress(c As Range) As String
    GetFullAddress = "'" amp; c.Parent.Name amp; "'!" amp; c.Address(external:=False)
End Function
  

Код выделяет все дубликаты. Как я могу пропустить первый экземпляр? Я имею в виду, что первый экземпляр не должен быть выделен.

Ответ №1:

 For Each idColl In dic
    Set adColl = dic(idColl)
    If adColl.Count >= 2 Then
        For i = 2 To adColl.Count
            dupAdd = adColl(i)
            Set c = Range(dupAdd)
            c.Interior.ColorIndex = 3
        Next
    End If
Next idColl
  

Ответ №2:

     Sub Test()
Dim idColl, dupAdd, ws As Worksheet, adColl As Collection, dic As Object, r As Range, c As Range
Application.ScreenUpdating = False
    Set dic = CreateObject("Scripting.Dictionary")
    For Each ws In ThisWorkbook.Sheets
        For Each r In ws.Range("A1:A" amp; ws.Cells(Rows.Count, 1).End(xlUp).Row)
            If Not IsEmpty(r) Then
                If Not dic.Exists(r.Value) Then
                    Set dic(r.Value) = New Collection
                End If
                dic(r.Value).Add GetFullAddress(r)
            End If
        Next r
    Next ws
    For Each idColl In dic
        Set adColl = dic(idColl)
        If adColl.Count >= 2 Then
        i = 1
            For Each dupAdd In adColl
            If i <> 1 Then
                Set c = Range(dupAdd)
                c.Interior.ColorIndex = 3
                         End If
                         i = i   1
            Next dupAdd
        End If
    Next idColl
Application.ScreenUpdating = True
End Sub

Private Function GetFullAddress(c As Range) As String
GetFullAddress = "'" amp; c.Parent.Name amp; "'!" amp; c.Address(external:=False)
End Function
  

Комментарии:

1. Большое спасибо. Это та же идея, что и в публикации ZanyBaka. Большое вам спасибо.