Calc Формат ячеек и Очистка формата

Автор timal1234, 27 марта 2024, 11:33

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

timal1234

#15
Цитата: sokol92 от 27 марта 2024, 17:14getCellByPosition возвращет ячейку, а не диапазон, getCellRangeByPosition возвращает диапазон, getCellRangeByName тоже возвращает диапазон (Вы выбираете, какой метод Вам удобнее).
Описанные в макросе конструкции работают c ячейкой, с прямоугольным диапазоном ячеек (SheetCellRange), с несколькими прямоугольными диапазонами ячеек (SheetCellRanges).

пока ждал ответа - уже сам разобрался....  ;D  ;D  ;D

ОГРОМНОЕ СПАСИБО !!!

timal1234

вот что получилось:
Sub Main
rem ----------------------------------------------------------------------
' define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
' get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

'=============== определяем последнюю заполненную ячейку в таблице на листе "СП" ===========================
Dim oSheets As Variant
Dim oSheet As Variant
Dim oEmptyRanges As Variant
Dim nLastRow_Curr_Column_SP As Long ' последняя заполненная ячейка в текущем столбце
Dim nLastRow_Curr_Page_SP As Long ' наибольшая последняя заполненная ячейка в диапазоне столбцов

nLastRow_Curr_Page_SP = 0

oSheets = ThisComponent.getSheets()
oSheet = ThisComponent.Sheets.GetByName("СП")

For i = 0 to 24 ' столбцов в таблице
oEmptyRanges = oSheet.getColumns().getByIndex(i).queryEmptyCells() ' Здесь замеряется текущая колонка
nLastRow_Curr_Column_SP = -1
If oEmptyRanges.getCount() > 0 Then
nLastRow_Curr_Column_SP = oEmptyRanges.getByIndex(oEmptyRanges.getCount()-1).getRangeAddress().StartRow
End If

If nLastRow_Curr_Page_SP < nLastRow_Curr_Column_SP then
nLastRow_Curr_Page_SP = nLastRow_Curr_Column_SP
End If
Next i
'===============

RAZDEL_SP_Names = ARRAY("Комплексы" , "Сборочные единицы" , "Детали" , "Стандартные изделия" , "Прочие изделия" , "Материалы" , "Комплекты")

Dim Curr_Row
Dim Curr_Col



'-------------- вернуть формат -----------
FormatSelection_RETURN(16, 2, 24, nLastRow_Curr_Page_SP) ' (Start_Col, Start_Row, End_Col, End_Row)
'--------------------------------------------------

FOR x = 0 to UBound(RAZDEL_SP_Names)
FOR  i = 2 to nLastRow_Curr_Page_SP
ThisComponent.Sheets.GetByName("СП").getCellByPosition(12, i).String = "-" ' разделитель
IF ThisComponent.Sheets.GetByName("СП").getCellByPosition(17, i).String = RAZDEL_SP_Names(x) THEN
Curr_Col = 17
Curr_Row = i
' ----------- отправить сделать текст жирным, подчёркнутым, по центру ------------------------------
FormatSelection_SET(Curr_Col, Curr_Row)

i = nLastRow_Curr_Page_SP
END IF
NEXT i
NEXT x
End Sub
'============================='
Sub FormatSelection_SET(Curr_Col, Curr_Row)

   With ThisComponent.getSheets.getByName("СП").getCellByPosition(Curr_Col, Curr_Row)
 
    ' Свойства символа https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1style_1_1CharacterProperties.html
    .CharWeight = com.sun.star.awt.FontWeight.BOLD   ' жирный шрифт
   
    .CharUnderline = 1                                   ' подчеркивание одиночной линией com.sun.star.awt.FontUnderline.Single
   
    ' Свойства ячейки https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1table_1_1CellProperties.html
    .HoriJustify=com.sun.star.table.CellHoriJustify.CENTER ' выравнивание по горизонтали по середине
  End With

End Sub
'============================='
Sub FormatSelection_RETURN(Start_Col, Start_Row, End_Col, End_Row)

 With ThisComponent.getSheets.getByName("СП").getCellRangeByPosition(Start_Col, Start_Row, End_Col, End_Row)
 
'   ' Убираем все форматирование
'     .clearContents com.sun.star.sheet.CellFlags.HARDATTR
 
    ' Свойства символа https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1style_1_1CharacterProperties.html
    .CharWeight = com.sun.star.awt.FontWeight.NORMAL   ' обычный шрифт
   
    .CharUnderline = 0                                   ' нет подчеркивания com.sun.star.awt.FontUnderline.Single
   
  ' Свойства ячейки https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1table_1_1CellProperties.html
    .HoriJustify=com.sun.star.table.CellHoriJustify.CENTER ' выравнивание по горизонтали по середине
   
 End With 
End Sub

economist

Цитата: timal1234 от 27 марта 2024, 15:38но хотелось без VBA  :)

Не знаю как сделана трансляция кода, но VBA в Calc работает почти с той же скоростью, что и Basic, при этом VBA-код всегда в 4 раза короче и проще. Поэтому желание понятное, но в долгосрочной перспективе - несбыточное.

VBA слишком хорош чтобы его не использовать. Макросы часто носят одноразовый характер и писать такие академично слишком трудно и бессмысленно. Тем более что нужно уметь в VBA, объем Легаси-кода огромен.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

timal1234

Цитата: economist от 27 марта 2024, 17:42
Цитата: timal1234 от 27 марта 2024, 15:38но хотелось без VBA  :)

Не знаю как сделана трансляция кода, но VBA в Calc работает почти с той же скоростью, что и Basic, при этом VBA-код всегда в 4 раза короче и проще. Поэтому желание понятное, но в долгосрочной перспективе - несбыточное.

VBA слишком хорош чтобы его не использовать. Макросы часто носят одноразовый характер и писать такие академично слишком трудно и бессмысленно. Тем более что нужно уметь в VBA, объем Легаси-кода огромен.
я со StarBasic ещё не очень дружу (если не сказать хуже), а параллельно ещё и VBA осваивать совсем некогда ... :) 
где бы ещё нормальное описание всех этих "com.sun.star...." найти

economist

#19
Осваивать можно оба языка, если вы не поняли - они работают в одном коде, не мешая друг другу.

Запомнить vba-команды и константы можно, они короткие, в отличие от com.sun.star... и это данность, которая многих отворачивает от StarBasic.

Ссылки на документацию вам давали, но понять ее сложно, поскольку команды слишком многословны. Большой рывок можно сделать, если пользоваться макрорекордером в Excel , в реальном времени (2 окна, ваши действия сразу превращаются в код) и копировать код или переписывать, если он не работает в StarBasic.

Прокачивать надо и обычные формулы/функции - многие злоупотребляют макросами, ленятся писать формулы, и это слишком заметный тренд, особенно у айтишников
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

timal1234

#20
Цитата: economist от 27 марта 2024, 18:48Осваивать можно оба языка, если вы не поняли - они работают в одном коде, не мешая друг другу.

Запомнить vba-команды и константы можно, они короткие, в отличие от com.sun.star... и это данность, которая многих отворачивает от StarBasic.

Ссылки на документацию вам давали, но понять ее сложно, поскольку команды слишком многословны. Большой рывок можно сделать, если пользоваться макрорекордером в Excel , в реальном времени (2 окна, ваши действия сразу превращаются в код) и копировать код или переписывать, если он не работает в StarBasic.

Прокачивать надо и обычные формулы/функции - многие злоупотребляют макросами, ленятся писать формулы, и это слишком заметный тренд, особенно у айтишников

Цитироватьесли вы не поняли - они работают в одном коде, не мешая друг другу.
конечно я догадался об этом.
Цитироватьcom.sun.star... понять ее сложно, поскольку команды слишком многословны.
это я понял.
поэтому и спрашивал, нет ли подробного описания, но чтоб не прыгать по этому совсем неудобному (для меня) сайту...
ЦитироватьПрокачивать надо и обычные формулы/функции
формулы могут удалить нечаянно.... а макрос - есть макрос. в него не каждый полезет.

economist

Формулы можно защитить. Они легко переживут любую хирургию листа в соседних ячейках.

Макрос тоже можно защитить, но он очень уязвим от изменений на листе, сделать вечный макрос чрезвычайно трудно. Придется написать не в 10 раз больше кода чем мой пример выше на VBA рядом с Basic, а в... 50

Если такие объемы не страшат - дерзайте.  На мой взгляд макросы эффективны там, где незаменимы формулами и функционалом программы. Он (функционал) очень большой и мы все его знаем далеко не полностью. На его изучение тоже нужно найти время.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

timal1234

Цитата: economist от 27 марта 2024, 19:13Формулы

зато от этих формул файл может тормозить... и работает иногда медленнее...
я и начинал с формул....
но после того, как пришлось на исходной вкладке сделать перестановку строк и формулы уплыли... мне это не понравилось....
и как только я не изворачивался, но итог такой: всё равно где-то возникало неудобство при редактировании - либо на исходном листе, либо на листе с формулами.
и мой выбор пал на макросы.

economist

Чтобы формулы не плыли от перестановок строк - нужно использовать F4 для превращения ссылок относит. в абсолютные и обратно, и понять в чем смысл смешанных ссылок. Часто стоит именовать диапазон и написать формулу с ним - она станет "неубиваемой".

Макросы в целом медленнее формул меняют ячейки. Но главное - с формулами можно всегда кого-нибудь ещё припахать (по сети, в режиме общего доступа), а с макросами придется возиться самому.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

timal1234

Цитата: economist от 27 марта 2024, 21:05Чтобы формулы не плыли от перестановок строк - нужно использовать F4 для превращения ссылок относит. в абсолютные и обратно, и понять в чем смысл смешанных ссылок. Часто стоит именовать диапазон и написать формулу с ним - она станет "неубиваемой".
превращал и в относительные и в абсолютные... про F4 не знал.... мне макросы удобнее.
Цитата: economist от 27 марта 2024, 21:05Макросы в целом медленнее формул меняют ячейки. Но главное - с формулами можно всегда кого-нибудь ещё припахать (по сети, в режиме общего доступа), а с макросами придется возиться самому.
я имею ввиду, загружаешь документ, а он тормозит из-за этих формул....

timal1234

Цитата: timal1234 от 27 марта 2024, 16:34
Цитата: sokol92 от 27 марта 2024, 16:28    .CharWeight = com.sun.star.awt.FontWeight.NORMAL        ' обычный шрифт
    .CharUnderline = 0                                      ' нет подчеркивания (com.sun.star.awt.FontUnderline.NONE)

    .HoriJustify=com.sun.star.table.CellHoriJustify.STANDARD ' выравнивание по умолчанию
Если Вам надо (временно) поменять форматирование ячейки, то это можно сделать путем присвоения ей стиля.
по Вашему коду я догадался, где подправить  ;D  ;D  ;D
но всё равно огромное СПАСИБО !!!!


Ещё вопрос:
хочу выставить оптимальную высоту, но выдаёт ошибку : Свойство или метод не найдены .OptimalHeight.
.OptimalHeight = com.sun.star.table.TableRow.OptimalHeight.TRUEКак правильно сделать?

timal1234

Цитата: timal1234 от 28 марта 2024, 16:04Ещё вопрос:
хочу выставить оптимальную высоту, но выдаёт ошибку : Свойство или метод не найдены .OptimalHeight.
.OptimalHeight = com.sun.star.table.TableRow.OptimalHeight.TRUEКак правильно сделать?
Вроде получилось, но только через цикл.
FOR i = Start_Row to End_Row
Row = ThisComponent.getSheets.getByName("СП").Rows(i)
Row.OptimalHeight = True
NEXT i
А как сразу передать диапазон строк? Или так нельзя?

timal1234

Цитата: timal1234 от 28 марта 2024, 16:59
Цитата: timal1234 от 28 марта 2024, 16:04Ещё вопрос:
хочу выставить оптимальную высоту, но выдаёт ошибку : Свойство или метод не найдены .OptimalHeight.
.OptimalHeight = com.sun.star.table.TableRow.OptimalHeight.TRUEКак правильно сделать?
Вроде получилось, но только через цикл.
    FOR i = Start_Row to End_Row
            Row = ThisComponent.getSheets.getByName("СП").Rows(i)
            Row.OptimalHeight = True
    NEXT i   
А как сразу передать диапазон строк? Или так нельзя?
а нет... не получилось  ???

sokol92

Цитата: timal1234 от 28 марта 2024, 16:59А как сразу передать диапазон строк? Или так нельзя?
oRange.Rows.OptimalHeight=TrueСм. это сообщение.
Владимир.

timal1234

Цитата: sokol92 от 28 марта 2024, 17:09
Цитата: timal1234 от 28 марта 2024, 16:59А как сразу передать диапазон строк? Или так нельзя?
oRange.Rows.OptimalHeight=TrueСм. это сообщение.
что-то ничего не получается....
Dim oRange As Object

oRange = ThisComponent.getSheets.getByName("ЭМ").getCellRangeByPosition(0, 0, 6, nLastRow - 2)
oRange.Rows.OptimalHeight = True
oRange.Rows.Height = 0

запутался.... как выставить оптимальную высоту диапазону ?