Isso funcionará até você encontrar um erro. E então ele pára de funcionar. Não tenho certeza do porquê, talvez você ou outra pessoa possa corrigi-lo, mas ele funcionará para sua seleção, desde que sua seleção seja encontrada (por exemplo, "roxo" interrompe o ciclo)
Sub test()
Dim a As Variant
Application.ScreenUpdating = False
On Error Resume Next
Err.Clear
For Each c In Selection
a = Application.WorksheetFunction.VLookup(c, Range("C1:D3"), 2, False)
If Err.Number = 0 Then c.Value = a
Next
Application.ScreenUpdating = True
End Sub