I am trying to highlight duplicates across a workbook of 12 sheets.
We track ID#s and I want to highlight the cell if an ID# (value) is on any of the other sheets.
Here is a simplified example that should give you some ideas and point you in the right direction. If you have an questions, let me know.
Sub collected_ids_example()
' enable microsoft scripting runtime --> tools - references
' For convenience I put all code in 2 subs/functions
' This code assumes you want every cell with a duplicate id highlighted.
' Although it is easy enough to modify that if you want.
Dim sh As Worksheet
Dim id_to_addresses As New Dictionary
Dim id_ As Range
' For every worksheet collect all ids and their associated adressses
' for the specified range.
For Each sh In ThisWorkbook.Sheets
For Each id_ In sh.Range("A4:A100")
If Not IsEmpty(id_) Then
If Not id_to_addresses.Exists(id_.Value) Then
Set id_to_addresses(id_.Value) = New Collection
End If
id_to_addresses(id_.Value).Add get_full_address(id_)
End If
Next id_
Next sh
' Color each cell with a duplicate id
Dim collected_id As Variant
Dim adresses As Collection
Dim c As Range
For Each collected_id In id_to_addresses
Dim duplicate_address As Variant
Set adresses = id_to_addresses(collected_id)
'You have a duplicate if an id is associated with more than 1 addrress
If adresses.Count >= 2 Then
For Each duplicate_address In adresses
Set c = Range(duplicate_address)
c.Interior.ColorIndex = 3
Next duplicate_address
End If
Next collected_id
End Sub
Private Function get_full_address(c As Range) As String
get_full_address = "'" & c.Parent.Name & "'!" & c.Address(External:=False)
End Function
What this code does is loops through the values of Col A in the sheet which gets activated and then it searches the Col A of all the remaining worksheets and if it finds the ID then it colors the cell background to red.
TRIED AND TESTED
I have commented the code so you shouldn't have a problem understanding it. If you still do then simply post back :)
Try this
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim lRow As Long, wsLRow As Long, i As Long
Dim aCell As Range
Dim ws As Worksheet
Dim strSearch As String
With Sh
'~~> Get last row in Col A of the sheet
'~~> which got activated
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
'~~> Remove existing Color from the column
'~~> This is to cater for any deletions in the
'~~> other sheets so that cells can be re-colored
.Columns(1).Interior.ColorIndex = xlNone
'~~> Loop through the cells of the sheet which
'~~> got activated
For i = 1 To lRow
'~~> Store the ID in a variable
strSearch = .Range("A" & i).Value
'~~> loop through the worksheets in the workbook
For Each ws In ThisWorkbook.Worksheets
'~~> This is to ensure that it doesn't
'~~> search itself
If ws.Name <> Sh.Name Then
'~~> Get last row in Col A of the sheet
wsLRow = ws.Range("A" & ws.Rows.Count).End(xlUp).Row
'~~> Use .Find to quick check for the duplicate
Set aCell = ws.Range("A1:A" & wsLRow).Find(What:=strSearch, _
LookIn:=xlValues, _
LookAt:=xlWhole, _
SearchOrder:=xlByRows, _
SearchDirection:=xlNext, _
MatchCase:=False, _
SearchFormat:=False)
'~~> If found then color the cell red and exit the loop
'~~> No point searching rest of the sheets
If Not aCell Is Nothing Then
Sh.Range("A" & i).Interior.ColorIndex = 3
Exit For
End If
End If
Next ws
Next i
End With
End Sub