Я сделал несколько изменений в вашем коде, чтобы очистить его и сделать его более эффективным.Во-первых, поскольку Sheet2 содержит все изменения, мы будем зацикливаться на этом листе и искать значения на листе 1. Это более эффективно, поскольку не тратит впустую операции, проходящие через ячейки в sheet1, которые не имеют каких-либо изменений..
Кроме того, я сделал динамические диапазоны, чтобы вы не ограничивались диапазоном «A2: E3000» во всех случаях.Если я правильно понимаю, sheet2 будет подмножеством sheet1, поэтому есть случаи, когда у него будет меньше строк.Нет причин перебирать пустые строки.
Наконец, я использую функцию Match
для поиска совпадений.Имейте в виду, что функция возвращает положение относительно диапазона.Таким образом, если вы ищете совпадение в Range («A5: A10»), и совпадение найдено в ячейке A5
, функция вернет 1 (не 5).Вот почему я смещаю переменную fndRow
.
Дайте мне знать, если это работает для вас или у вас есть дополнительные вопросы.
Sub Test()
Dim wbk As Workbook
Dim wsA As Worksheet
Dim wsB As Worksheet
Dim rngA As Range
Dim rngB As Range
Dim rIterator As Range
Dim fndRow As Long
Set wbk = ThisWorkbook
Set wsA = wbk.Sheets("Sheet1")
Set wsB = wbk.Sheets("Sheet2")
'CurrentRegion should work to bring in the entire
'necessary range so long as it is contiguous data
Set rngA = wsA.Range(wsA.Range("A2"), wsA.Range("A2").End(xlDown))
Set rngB = wsB.Range(wsB.Range("A2"), wsB.Range("A2").End(xlDown))
For Each rIterator In rngB
On Error Resume Next
fndRow = Application.Match(rIterator.Value, rngA, 0) + _
rngA.Range("A1").Row - 1
If Err.Number <> 0 Then
'What happens if it isn't found?
Else
wsA.Cells(fndRow, 3).Value = rIterator.Offset(, 2).Value
wsA.Cells(fndRow, 4).Value = rIterator.Offset(, 3).Value
wsA.Cells(fndRow, 5).Value = rIterator.Offset(, 4).Value
wsA.Cells(fndRow + 1, 3).Value = rIterator.Offset(, 2).Value * 1.1
wsA.Cells(fndRow + 1, 4).Value = rIterator.Offset(, 3).Value * 1.1
wsA.Cells(fndRow + 1, 5).Value = rIterator.Offset(, 4).Value * 1.1
wsA.Cells(fndRow + 2, 3).Value = rIterator.Offset(, 2).Value * 1.2
wsA.Cells(fndRow + 2, 4).Value = rIterator.Offset(, 3).Value * 1.2
wsA.Cells(fndRow + 2, 5).Value = rIterator.Offset(, 4).Value * 1.2
'.... Repeat for all rows
End If
Err.Clear
Next rIterator
End Sub