Solution 1
Public Sub CopyUsingSearch()
'# declare
Dim xlsData As Worksheet
Dim xlsTracker As Worksheet
Dim rngDataCell As Range
'# initialise
Set xlsData = ThisWorkbook.Worksheets("Data")
Set xlsTracker = ThisWorkbook.Worksheets("Tracker")
'# copy
With xlsData
For Each rngDataCell In .Range("A1", .Cells(.Rows.Count, "A").End(xlUp))
If xlsTracker.Range("A:A").Find(rngDataCell.Value, , , xlWhole) Is Nothing Then
xlsTracker.Cells(xlsTracker.Rows.Count, "A").End(xlUp).Offset(1).Value = rngDataCell.Value
End If
Next rngDataCell
End With
End Sub
For every value from the Data worksheet a search will be performed on the Tracker worksheet, and the entry will be added when not found. It works but may be slow when comparing a large number of values
Solution 2
Public Sub CopyUsingIndex()
'# declare
Dim xlsData As Worksheet
Dim xlsTracker As Worksheet
Dim lngRowNumber As Long
Dim lngTargetRow As Long
Dim rngDataCell As Range
Dim dctIndex As Object
'# initialise
Set xlsData = ThisWorkbook.Worksheets("Data")
Set xlsTracker = ThisWorkbook.Worksheets("Tracker")
Set dctIndex = CreateObject("Scripting.Dictionary")
dctIndex.CompareMode = 1
'# build index of existing values
With xlsTracker
lngTargetRow = .Cells(.Rows.Count, "A").End(xlUp).Row
For lngRowNumber = 1 To lngTargetRow
If Not dctIndex.Exists(.Cells(lngRowNumber, "A").Value) Then
dctIndex.Add .Cells(lngRowNumber, "A").Value, lngRowNumber
End If
Next lngRowNumber
End With
'# copy data that does not exist as yet
With xlsData
For lngRowNumber = 1 To .Cells(.Rows.Count, "A").End(xlUp).Row
If Not dctIndex.Exists(.Cells(lngRowNumber, "A").Value) Then
lngTargetRow = lngTargetRow + 1
xlsTracker.Cells(lngTargetRow, "A").Value = .Cells(lngRowNumber, "A").Value
End If
Next lngRowNumber
End With
End Sub
Same concept but now using an keyed index (dictionary). More code but faster when processing large quantities
Bookmarks