This macro provides an alternative to vlookup (which looks at two lists and provides data from one list to the second) that retains similar functionality while providing certain benefits. It accomplishes this by physically moving one list to the other. It’s impossible to get a false positive, and it doesn’t provide that annoying #N/A that messes up calculations.
Additionally, it let’s you decide whether to identify the matches and move them to the top (useful for quickly working with data), or not (useful in identifying holes in each list and working with that).
And here is the macro itself. Copy/paste the code, or download the file here (if it opens as text, right click and “Save link as”).
Sub compare_lists() ' Author: Amit Kohli 'START ON COLUMN TO TEST If Application.ReferenceStyle = xlA1 Then Application.ReferenceStyle = xlR1C1 change_back = 1 Else Application.ReferenceStyle = xlA1 End If firstr = ActiveCell.Row firstc = ActiveCell.Column col_comp = InputBox("What column has the correct names?") '===================== 'tt = 100 'Uncomment this if you know you will always have x columns of data following the name (where in this case x=100) tt = InputBox("How many columns of data?") '===================== If change_back = 1 Then Application.ReferenceStyle = xlA1 If tt = "" Or col_comp = "" Then Exit Sub beg: If ActiveCell.Value <> ActiveCell.Offset(0, col_comp - ActiveCell.Column).Value Then While ActiveCell.Value <> ActiveCell.Offset(i, col_comp - ActiveCell.Column).Value And ActiveCell.Offset(i, col_comp - ActiveCell.Column).Value <> "" i = i + 1 Wend If ActiveCell.Value = ActiveCell.Offset(i, col_comp - ActiveCell.Column).Value Then Range(ActiveCell, ActiveCell.Offset(i - 1, tt)).Select Selection.Insert Shift:=xlDown ActiveCell.Offset(i, 0).Activate Else ActiveCell.EntireRow.Insert Range(ActiveCell, ActiveCell.Offset(0, tt)).Delete Shift:=xlUp ActiveCell.Offset(1, 0).Activate i = 0 GoTo beg End If i = 0 Else ActiveCell.Offset(1, 0).Activate End If If ActiveCell.Value <> "" Then GoTo beg cont = MsgBox("Move matches to top?", vbYesNo) If cont = 6 Then Range(ActiveCell.Offset(0, tt), ActiveCell.Offset(firstr - ActiveCell.Row, col_comp - ActiveCell.Column)).Select Selection.Sort Key1:=Range(ActiveCell.Offset(0, firstc - ActiveCell.Column).Address), Order1:=xlAscending, Header:=xlNo ActiveCell.Offset(0, firstc - col_comp).Select Selection.End(xlDown).Activate Range(ActiveCell.Offset(0, tt), ActiveCell.Offset(firstr - ActiveCell.Row, col_comp - ActiveCell.Column)).Select Selection.Sort Key1:=Range(ActiveCell.Address), Order1:=xlAscending, Header:=xlNo Selection.End(xlDown).Activate ActiveCell.EntireRow.Borders(xlEdgeBottom).LineStyle = xlDouble End If ActiveCell.Offset(1 - ActiveCell.Row, 0).Activate End Sub
I uploaded a video tutorial, you can see it here (please view in fullscreen mode, or watch the video in youtube by clicking on the logo):[youtube=https://www.youtube.com/watch?v=4lcEB28JpJg]