К сожалению, у меня нет данных для проверки вашего или моего кода. Поэтому я не могу развить представление о том, что вы пытаетесь сделать. Тем не менее, я рассмотрел ваш код и ниже приведен результат. В ней не должно быть ошибки, на которую вы жаловались.
Sub ReviewedCode()
Dim Ws As Worksheet
Dim WsBom As Worksheet
Dim WsInfo As Worksheet
Dim MatchRng As Range
Dim MatchVal As Variant
Dim MatchPos As Long
Dim BomCell As Range
Dim RefCell As Range
Dim NumRows As Integer
Dim R As Long
Dim Rt As Long ' Target row
Set Ws = Worksheets("Working BoM")
Set WsInfo = Worksheets("Line Info")
Set WsBom = Worksheets("BoM")
MatchRng = WsBom.Range("A2:Y2")
NumRows = 4
For R = 1 To NumRows
MatchVal = WsInfo.Cells(R, "C").Value
On Error Resume Next ' in case no match is found
MatchPos = Application.WorksheetFunction.Match(MatchVal, MatchRng, 0)
If Err.Number Then
' enter code here what to do if there was no match
' for now: do nothing & skip to next row
Else
Set BomCell = WsBom.Cells(2, MatchPos)
Set RefCell = Ws.Cells(1, 4 * (R - 1) + 1)
Rt = WsBom.Range("A2").Offset(0, MatchPos - 1).End(xlDown).Row - 1
WsBom.Range(BomCell, BomCell.Offset(Rt, 2)).Copy _
Destination:=Ws.Range(RefCell, RefCell.Offset(Rt, 2))
End If
Next R
End Sub
Как видите, наиболее заметные изменения - это список всех переменных, которые вы использовали. Это поможет вам избежать ловушки, в которую вы попали, не зная, является ли bom_cell
диапазоном, значением или адресом. Извините, что удалил все ваши прекрасные имена змей. Я не могу их читать. В остальном я сохранил ваш код таким, каким он был, но адаптировал его для правильного использования определенных вами переменных.