Можно, всё можно.
Дело в том, что нужно просто понять что это за зверь .getCellRangeByPosition и какие параметры ему передаются.
Там всё просто - номер левой колонки, номер верхней строки, номер правой колонки, номер нижней строки. При этом не забывать, что нумерация начинается с нуля.
То есть для диапазона (A1:B2) нужно написать .getCellRangeByPosition(0,0,1,1), для (A4:B4) - .getCellRangeByPosition(0,3,1,3). Эти методы нужно применять к листу исходных данных (в нашим примере это iSheet).
Точно так же и диапазоны выходные:
(E7:F7) -> oSheet.getCellRangeByPosition(4, 6, 5, 6),
(E10:F10) -> oSheet.getCellRangeByPosition(4, 9, 5, 9)
Есть у листа еще и метод .getCellRangeByName("A4:B4") - ему можно диапазон ячеек подсовывать прямо в виде текстовой строки, не заморачиваясь пересчетом колонок и столбцов. Но, что касается меня, то стараюсь все-таки использовать .getCellRangeByPosition(). Просто был у меня случай, когда скопировал диапазон из сообщения на форуме и целый день искал ошибку в коде. А оказалось, что А12:С240 было написано РУССКИМИ буквами.
Да, а копирование данных диапазон в диапазон можно записать одной длинной строкой
oSheet.getCellRangeByPosition(4, 6, 5, 6).setFormulaArray(iSheet.getCellRangeByPosition(0,0,1,1).getDataArray())
Не смотря на "ужасный", нечитаемый вид - должна работать.
PS. И не надо копировать весь текст макроса в следующее сообщение - только тот кусочек, который вызывает вопросы. И форматируй, плз, эти фрагменты как код (такая специальная кнопочка с "диезом")