макрос Calc как вставить новый пустой лист не последним

Автор timal1234, 18 ноября 2024, 12:46

0 Пользователи и 1 гость просматривают эту тему.

timal1234

Всем привет!

собственно вопрос в названии темы:

как в Calc макросом вставить новый пустой лист не последним , а в нужное мне место ?
Ну или как передвинуть новый лист в нужное место ?
Вообще мне надо создать новый лист и скопировать с листа-источника первые несколько строк (шапку таблицы и кнопки с запуском макроса).


если так - то лист вставляет последним, но копирует с листа-источника нормально:

' Создание листа
Dim oDoc As Object
Dim oSheetNew As Object
Dim oSheetSource As Object  ' откуда копировать
oDoc = ThisComponent ' текущий документ
oSheetSource = ThisComponent.Sheets.getByName("СП_ОСН") ' откуда копировать
oSheetNew = oDoc.createInstance("com.sun.star.sheet.Spreadsheet")
oDoc.Sheets.insertByName(Sheet_SP_Name, oSheetNew ) ' вставка нового листа с именем "Sheet_SP_Name" последним
oSheetNew = oDoc.Sheets.getByName(Sheet_SP_Name)

'==============================
' копировать с листа СП_ОСН (шапку)
'=================================
'------------------- копировать всё -----------------------------
Dim oRangeFrom as Object ' дипапазон копирования
Dim oCellCopyTo as Object ' ячейка, куда вставить
oRangeFrom = oSheetSource.getCellRangeByName("A1:Z2").getRangeAddress()
oCellCopyTo  = oSheetNew.getCellRangeByName("A1").getCellAddress()
oSheetSource.copyRange(oCellCopyTo, oRangeFrom)
'-----------------------------------------------------------------------------


'---------- границы (обрамление ) ячеек ----------------------------
RangeBorderHairline(oSheetNew.getCellRangeByPosition(0, 0, 25, 1)) ' (Col_Start, Row_Start, Col_End, Row_End)
'-------------------------------------------------------------------------------------

'---------- копируем ширину столбцов ----------------------------
FOR i = 0 to 25 ' столбцов на листе источника
oSheetNew.Columns(i).Width = oSheetSource.Columns(i).Width
NEXT i
'-------------------------------------------------------------------------------------

'---------- копируем высоту строки ----------------------------
FOR i = 0 to 1 ' строк шапки на листе источника
oSheetNew.Rows(i).Height = oSheetSource.Rows(i).Height
NEXT i
'-------------------------------------------------------------------------------------

а если так - то вставляет лист куда мне нужно, но копирует без форматирования и объектов (кнопок макроса):

' Создание листа
Dim oDoc As Object
Dim oSheetNew As Object
Dim oSheetSource As Object  ' откуда копировать
oDoc = ThisComponent ' текущий документ
oSheetSource = ThisComponent.Sheets.getByName("СП_ОСН") ' откуда копировать

' вставка нового листа с именем "Sheet_SP_Name" перед листом "ПЭ4<->СП<->ФО"
Curr_Sheets_Count = ThisComponent.getSheets.getCount
oSheetNew = ThisComponent.Sheets.insertNewByName( Sheet_SP_Name , Curr_Sheets_Count - 5)

'==============================
' копировать с листа СП_ОСН (шапку)
'=================================
'------------------- копировать всё -----------------------------
Dim oRangeFrom as Object ' дипапазон копирования
Dim oCellCopyTo as Object ' ячейка, куда вставить
oRangeFrom = oSheetSource.getCellRangeByName("A1:Z2").getRangeAddress()
oCellCopyTo  = oSheetNew.getCellRangeByName("A1").getCellAddress()
oSheetSource.copyRange(oCellCopyTo, oRangeFrom)
'-----------------------------------------------------------------------------

'---------- границы (обрамление ) ячеек ----------------------------
RangeBorderHairline(oSheetNew.getCellRangeByPosition(0, 0, 25, 1)) ' (Col_Start, Row_Start, Col_End, Row_End)
'-------------------------------------------------------------------------------------

'---------- копируем ширину столбцов ----------------------------
FOR i = 0 to 25 ' столбцов на листе источника
oSheetNew.Columns(i).Width = oSheetSource.Columns(i).Width
NEXT i
'-------------------------------------------------------------------------------------

'---------- копируем высоту строки ----------------------------
FOR i = 0 to 1 ' строк шапки на листе источника
oSheetNew.Rows(i).Height = oSheetSource.Rows(i).Height
NEXT i
'-------------------------------------------------------------------------------------

mikekaganski

insertByName (из первого варианта) + moveByName.

Или copyByName - и удалить всё ненужное.
С уважением,
Михаил Каганский

timal1234

#2
Цитата: mikekaganski от 18 ноября 2024, 13:14insertByName (из первого варианта) + moveByName.
Заработало!

Спасибо!


timal1234

#3
Всем привет ещё раз!
а как получить индекс листа, зная его имя ?

UPD:
нашёл

Цитата: sokol92 от 22 апреля 2021, 18:15Например, так:

Msgbox ThisComponent.Sheets.GetByName("Лист2").RangeAddress.Sheet
Индексы, естественно, от 0.