Копирование и вставка имеют приличную нагрузку в VBA, как и работа с такими диапазонами. Прошло много времени с тех пор, как я работал с VBA, но если я правильно помню, самый быстрый способ сделать что-то вроде этого - записать нужные значения в массив и затем использовать функцию Resize. Так что-то вроде этого:
Option Base 0
Dim firstrow as integer
Dim lastrow as integer
Dim valuesArray() as Long
Dim i as integer
//Set firstrow and lastrow however you deem appropriate
...
//Subtracing first row from last row gets you the needed size of the 0 based array
ReDim valuesArray(lastrow-firstrow)
for int i = 0 to (lastrow-firstrow)
valuesArray(i)=Cells(i+firstrow, COLUMNNUMBER).value
next i
Конечно, замените COLUMNNUMBER тем столбцом, который вы перебираете. Это должно заполнить ваш массив желаемыми значениями. Затем выберите ячейку назначения и используйте Resize для ввода значений. Так что если ячейка назначения D4:
Range("D4").Resize(UBound(valuesArray)+1, 0).value = valuesArray
Это записывает все значения в массиве, начиная с D4 и заканчивая количеством ячеек в массиве. Немного сложнее, но если вы идете на скорости, я не думаю, что я когда-либо придумал что-нибудь быстрее. Кроме того, я сделал это на макушке головы, поэтому, пожалуйста, проверьте и убедитесь, что вы не отрежете клетку здесь и там.