If I understand your question correctly, you effectively run an UPDATE query on your data based on the values โโin your mapping table.
I assumed the following:
The key column is the first column in your data table and in the mapping table.
The columns in the mapping table are in the same order and relative position as the columns in the data table (although this can be easily customized.
The order of the keys in the mapping table and data table is not sorted. If you can make sure the keys are sorted (ideally on both sheets), you can achieve significantly better performance with a few changes.
I hardcoded the ranges in my example, but you can restore the last row and last column approach if you need to.
I did all my comparisons between arrays, not ranges, and I ended up searching. You will find that it works and works much more efficiently.
Option Explicit Sub NewNameandCostCenter() Dim start As Double start = Timer Dim countOfChangedRows As Long 'set rngMap array Dim rngMap As Range Set rngMap = Worksheets("Map").Range("A1:D51") 'set rngData array Dim rngData As Range Set rngData = Worksheets("Data").Range("J2:M20001") Dim aMap As Variant aMap = rngMap.Value Dim aData As Variant aData = rngData.Value Dim mapRow As Long Dim datarow As Long Dim mapcol As Long For mapRow = LBound(aMap, 1) To UBound(aMap, 1) For datarow = LBound(aData) To UBound(aData) 'Check the key matches in both tables If aData(datarow, 1) = aMap(mapRow, 1) Then countOfChangedRows = countOfChangedRows + 1 'Assumes the columns in map and data match For mapcol = LBound(aMap, 2) + 1 To UBound(aMap, 2) aData(datarow, mapcol) = aMap(mapRow, mapcol) Next mapcol End If Next datarow Next mapRow rngData.Value = aData Debug.Print countOfChangedRows & " of "; UBound(aData, 1) & " rows updated in " & Timer - start & " seconds" End Sub
Performance is reasonable for 50 updated lines:
50 of 20000 rows updated in 0.23828125 seconds
But if you need to start updating thousands of rows, then it will be very useful for you to sort the data and set it up.
source share