Ну, почему сразу "франкенштейн"? Очень пристойный код, с пониманием написан, не просто цитаты из инета, слепленные кое-как.
Команда
Cells(ActiveCell.Row,1).Resize(k).EntireRow.Insert
не проходит, пишет мне "Переменная типа Object не установлена"
А зачем ты ограничиваешь длину строки k? Почему не оставить всю строку, .EntireRow? Или у тебя правее таблицы что-то ещё есть?
С ActiveCell не сложно - поищи здесь, по форуму. Где-то есть функция, которая именно активную ячейку возвращает. Это всё-таки будет лучше, чем новый вариант
...
oCellRange = ThisComponent.getCurrentSelection()
rowIndex = oCellRange.getCellByPosition(0,0).getCellAddress().Row
...
В принципе, всё верно, в большинстве случаев сработает именно так, как задумано. "Грабли" возникнут если запустить макрос при множественном выделении - с зажатой Ctrl выдели несколько ячеек и попробуй выполнить код. В этом случае .getCurrentSelection() вернёт не диапазон, у которого действительно можно взять первую, левую верхнюю ячейку, а целый набор диапазонов.
"Ну, а теперь о главном..." (с) старый театральный анекдот
Чтобы эта байда работала и в Эксель, и в LiO есть несколько путей.
Я бы сделал два макроса. Очень похожих, но заточенных отдельно под Calc и Excel. И сохранил бы их в библиотеках офиса: для LiO - в Мои Макросы, для Экселя - в персональной книге макросов. И кнопку (или горячую клавишу) вешал бы именно на них, но сохранял бы не в текущей книге, а в офисе целиком.
Другой путь - сотворить это вот и сохранить в книге Эксель. И сотворять именно средствами Экселя. В этом случае LiO очень постарается макрос выполнить. И если макрос будет без особых наворотов, то у Calc'а это получится.
Например, для первого способа Экселевский макрос мог бы быть таким:
Sub copyRow()
Dim aRange As Range ' Рабочий диапазон
Set aRange = ActiveCell.EntireRow ' Вся строка с активной ячейкой
aRange.Copy ' Чтобы при вставке новой строки одновременно вставить и контент
aRange.Offset(1, 0).Insert Shift:=xlDown ' Полная копия строки готова
Application.CutCopyMode = False ' Снять выделение
aRange.Offset(1, 0).Range("A1:D1").ClearContents ' Очистить первые ячейки
' (в aRange всего одна строка - поэтому и ссылаемся на ячейки "первой" строки)
aRange.Offset(1, 0).Resize(1, 1).Select ' Передвинуться на первую ячейку строки на одну ниже
End Sub
В Экселе работает хорошо, а в Calc'е начнет ругаться на "нехорошие слова".
Чтобы заставить код работать и там, и там, придётся несколько раз открывать книгу в разных офисах, экспериментировать.
В результате получится что-то вроде такого:
Sub insRow()
Dim aRange As Range
Set aRange = ActiveCell.Offset(0, -ActiveCell.Column + 1).Resize(1, 50)
aRange.Select
Selection.Copy
aRange.Offset(1, 0).Select
Selection.Insert Shift:=xlDown
Application.CutCopyMode = False
aRange.Offset(1, 0).Resize(1, 4).ClearContents
aRange.Offset(1, 0).Resize(1, 1).Select
End Sub
Другими словами, всячески избегать .Parent, .EntireRow и других прибамбасов, которые с точки зрения LiO не должны существовать в электронной книге
