Попробуйте это:
Sub HTH()
With Sheets("Data")
.Columns(2).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
.Cells(1, "B").Value = .Cells(1, "A").Value
With .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Offset(, 1)
.Formula = "=VLOOKUP(A2,Index!A:B,2,FALSE)"
.Value = .Value
End With
.Columns(1).Delete
End With
End Sub
Объяснение:
Sub HTH()
With Sheets("Data")
'// Insert a new column with same format
.Columns(2).Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
'// Copy the header
.Cells(1, "B").Value = .Cells(1, "A").Value
'// Work with the used range of column A
With .Range("A2", .Cells(Rows.Count, "A").End(xlUp)).Offset(, 1)
'// Use a formula to replace the names with corresponding values
.Formula = "=VLOOKUP(A2,Index!A:B,2,FALSE)"
'// Replace formula with value
.Value = .Value
End With
'// Delete the old column
.Columns(1).Delete
End With
End Sub
ПРИМЕЧАНИЕ:
Лично я бы оставил лист с необработанными данными каки используйте презентационный лист, который просматривает лист данных и индексный лист и представляет его так, как вы хотите.Тогда вам не обязательно нужен код, и если вы все еще хотите использовать код, тогда код будет намного проще.Вам нужно будет добавить код, чтобы отключить обновление экрана и использовать обработку ошибок и т. Д.
Альтернатива решению ja72:
Sub HTH()
Dim vNames As Variant, vResult As Variant
Dim lLoop As Long
vNames = Sheets("Index").UsedRange.Columns(1).Resize(, 2).Value2
vResult = Sheets("Data").UsedRange.Columns(1).Value2
With CreateObject("Scripting.Dictionary")
For lLoop = 2 To UBound(vNames, 1)
.Add vNames(lLoop, 1), vNames(lLoop, 2)
Next lLoop
For lLoop = 2 To UBound(vResult, 1)
vResult(lLoop, 1) = .Item(vResult(lLoop, 1))
Next lLoop
Sheets("Data").Range("A1").Resize(UBound(vResult, 1), 1).Value = vResult
End With
End Sub
тихо уверена, что он тоже быстрее;)