Поскольку я не мог смотреть на ваш ужасно неэффективный код, я переработал его здесь, основываясь на данных, предоставленных в вашем предыдущем вопросе.
Что он делает, это зацикливается на столбце 2 листа 2Затем для каждой ячейки он находит соответствующий идентификатор и сохраняет строку в «Hit».
Затем он находит три значения в строке ячейки и добавляет месяц, связанный с каждым попаданием, в правильное место вмассив.
Затем он вставляет массив за один раз в правильный диапазон на листе 1.
Sub movingValues()
Dim SheetOneWs As Worksheet, SheetTwoWs As Worksheet
Dim SheetOneLastRow As Long, SheetTwoLastRow As Long
Dim cel As Range, hit As Range
Dim Foundrow As Integer
Dim arr() As Variant
Application.Calculation = xlCalculationManual
Set SheetOneWs = ThisWorkbook.Worksheets("Sheet1")
Set SheetTwoWs = ThisWorkbook.Worksheets("Sheet2")
SheetOneLastRow = SheetOneWs.Range("A" & Rows.Count).End(xlUp).Row
SheetTwoLastRow = SheetTwoWs.Range("A" & Rows.Count).End(xlUp).Row
ReDim arr(1 To SheetOneLastRow - 1, 1 To 3)
For Each cel In SheetTwoWs.Range("A2:A" & SheetTwoLastRow)
Foundrow = SheetOneWs.Range("A1:A" & SheetOneLastRow).Find(cel.Value).Row - 1
If Not Foundrow = 0 Then
Set hit = SheetTwoWs.Rows(cel.Row).Find("No", SearchDirection:=xlNext)
If Not hit Is Nothing Then
arr(Foundrow, 1) = SheetTwoWs.Cells(1, hit.Column).Value
Else
arr(Foundrow, 1) = "No Data"
End If
Set hit = SheetTwoWs.Rows(cel.Row).Find("Maybe", SearchDirection:=xlNext)
If Not hit Is Nothing Then
arr(Foundrow, 2) = SheetTwoWs.Cells(1, hit.Column).Value
Else
arr(Foundrow, 2) = "No Data"
End If
Set hit = SheetTwoWs.Rows(cel.Row).Find("Yes", SearchDirection:=xlNext)
If Not hit Is Nothing Then
arr(Foundrow, 3) = SheetTwoWs.Cells(1, hit.Column).Value
Else
arr(Foundrow, 3) = "No Data"
End If
End If
Next cel
SheetOneWs.Range("B2:D" & SheetOneLastRow) = arr
End Sub
Как вы, вероятно, можете увидеть при попытке, сначала считывая значения в массивделает это в значительной степени мгновенным, так как это экономит на «дорогих» действиях записи. При наличии тестов и этой структуры она должна быть намного более простой и жесткой, чем ваш предыдущий код. Использование Find
означает, что нужно только зацикливаться на каждой строке один раз, что еще больше повышает производительность.
Обратите внимание, лучше создать резервную копию ваших данных перед попыткой на случай непредвиденных результатов и / или ошибок.