Ключевая ошибка в вашем коде заключается в том, что вы можете собрать диапазон непоследовательных ячеек и вставить их значение в непрерывный диапазон. Excel не может этого сделать. Мой код ниже собирает квалифицирующие значения в массив и вставляет этот массив в целевой диапазон.
Приведенный ниже код не может быть именно тем, что вы хотите, потому что вы не предоставили важную информацию. Тем не менее, попробуйте в любом случае, чтобы адаптировать его к вашему проекту.
Private Sub Review()
Dim Ws As Worksheet
Dim Rng As Range
Dim Rl As Long ' last row in column E
Dim Ary() As String
Dim Arr As Variant
Dim n As Long
Dim Cell As Range
Dim i As Long
Set Ws = Worksheets("Sheet1")
Ary = Split("C,F,B,PC,PB", ",") ' this array would be 0-based
Rl = Cells(Rows.Count, "E").End(xlUp).Row ' Range("E:E") has 1.4 million cells
Set Rng = Range(Cells(2, "E"), Cells(Rl, "E"))
For i = 0 To UBound(Ary)
ReDim Arr(1 To Rl)
n = 0
For Each Cell In Rng
If Cell.Value = Ary(i) Then
n = n + 1
Arr(n) = Cell.Offset(0, 1).Value
End If
Next Cell
If n Then
ReDim Preserve Arr(n)
'get values
Ws.Cells(Ws.Rows.Count, "N").End(xlUp).Offset(1) _
.Resize(UBound(Arr)).Value = Arr ' Application.Transpose(Arr)
End If
Next i
End Sub
Этот код полностью работает с ActiveSheet
, а затем вставляет результат на другой лист, называемый «Лист1». Это не хорошая практика. Лучшим способом было бы объявить переменные для обоих листов и позволить коду ссылаться на переменные, чтобы обеспечить полный контроль над тем, над каким листом он работает в любое время.