Функции Excel должны быть вложенными, потому что значение ячейки нужно анализировать как один шаг.
Код VBA не должен делать это.Инструкции VBA работают лучше всего, и их легче отлаживать, когда вы разбиваете их и заставляете выполнять как можно меньше работы.
Так что вместо этого:
wf.Index(rng.ListColumns("Firstname"), wf.Match(cs_sht, rng.ListColumns("Customer ID"), 0))
Разделите это:
Dim matchResult As Long
matchResult = WorksheetFunction.Match(cs_sht, rng.ListColumns("Customer ID").DataBodyRange, 0)
Dim indexResult As Variant
indexResult = WorksheetFunction.Index(rng.ListColumns("FirstName").DataBodyRange, matchResult)
Обратите внимание, что вы получите ошибку во время выполнения, если любая из функций не сможет найти то, что ищет.Используйте On Error
для обработки этого случая:
On Error GoTo CleanFail
Dim matchResult As Long
matchResult = WorksheetFunction.Match(...)
...
Exit Sub
CleanFail:
MsgBox "Could not find record for '" & cs_sht & "'." & vbNewLine & Err.Description
End Sub
Избавьтесь от wf
.Нет смысла копировать ссылки на объекты уже глобальных объектов.Чем меньше глобальных переменных вы используете, тем лучше.
если имя поменяется, я могу обновить таблицу, чтобы она соответствовала новому имени из моего листа
Вы не можете просто присвоить indexResult
новому значению.indexResult
не содержит ссылку на какую-либо ячейку, это всего лишь результат функции INDEX
листа.Вам нужно использовать этот результат, чтобы получить ячейку, которую вы хотите изменить:
Dim targetCell As Range
Set targetCell = rng.ListColumns("FirstName").DataBodyRange.Cells(indexResult)
targetCell.Value = ws.Range("C_Firstname").Value