Ваш код делает именно то, что вы объясняете, он делает ...
Я имею в виду, он все время копирует диапазон, извлеченный только из ЛИСТ SpecialCells(xlCellTypeVisible)
.
Для того, чтобы сделать то, что вам нужно, вы должны отнести необходимые ячейки к отфильтрованной области .
Итак, вы должны использовать (если это диапазон, который вам нужно отфильтровать, как я только предполагаю):
uniquesarray.AutoFilter field:=1, Criteria1:="=your criteria", Operator:=xlFilterValues
, а затем установите необходимые ячейки для копирования следующим образом:
Set firstcell = uniquesarray.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 1)
Set middlecell = uniquesarray.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 2)
Set lastcell = uniquesarray.Offset(1).SpecialCells(xlCellTypeVisible).Cells(1, 3)
Установка первой ячейки так, как вы это сделали, возвращает ее со ссылкой на диапазон листа, а не на тот, который (я понял) вам нужен ...
Не забудьте изменить "ваши критерии" с вашими реальными критериями фильтрации!
Помимо всего этого, это хорошая привычка всегда ставить Optin Explicit
поверх кода модуля и правильно объявлять ВСЕ ваши переменные. Это избавит вас от многих неприятностей, когда / если код станет пушистым.