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

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

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

timal1234

Всем привет!
у меня 2 вопроса к знатокам Basic :) :

1) Как правильно сделать форматирование нужных ячеек через макрос (жирный, подчёркнутый текст, выравнивание по середине)?
 я сделал вот так:
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 6 ' 7 столбцов в таблице СП
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
'===============



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

FOR x = 0 to UBound(RAZDEL_SP_Names)
FOR  i = 2 to nLastRow_Curr_Page_SP 'с 3-ей строки до последней заполненной строки таблицы'
IF ThisComponent.Sheets.GetByName("СП").getCellByPosition(4, i).String = RAZDEL_SP_Names(x) THEN 'ищу в столбце Е элементы массива RAZDEL_SP_Names'
'не нашёл другого способа передать адрес ячейки'
Cell_Adr = ThisComponent.Sheets.GetByName("СП").getCellByPosition(4, i).AbsoluteName
Cell_Adr = Right(Cell_Adr, Len(Cell_Adr) - 4)
Format_Name_of_Razdel(Cell_Adr)   ' Сделать текст жирным, подчёркнутым, по центру
i = nLastRow_Curr_Page_SP
END IF
NEXT i
NEXT x

End Sub


Sub Format_Name_of_Razdel(Cell_Adr)   ' Сделать текст жирным, подчёркнутым, по центру
'===================================================================
REM  ***** Сделать текст жирным, подчёркнутым, по центру *****
'===================================================================

'делал через запись макроса

rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")


ThisComponent.CurrentController.ActiveSheet = ThisComponent.Sheets.getByName("СП")

rem ----------------------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = CStr(Cell_Adr) 'по другому не работало   

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

'MsgBox( "Cell_Adr = " +  Cell_Adr)

rem ----------------------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "Bold"
args2(0).Value = true

dispatcher.executeDispatch(document, ".uno:Bold", "", 0, args2())

rem ----------------------------------------------------------------------
dim args3(2) as new com.sun.star.beans.PropertyValue
args3(0).Name = "Underline.LineStyle"
args3(0).Value = 1
args3(1).Name = "Underline.HasColor"
args3(1).Value = false
args3(2).Name = "Underline.Color"
args3(2).Value = -1

dispatcher.executeDispatch(document, ".uno:Underline", "", 0, args3())

rem ----------------------------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "HorizontalAlignment"
args4(0).Value = com.sun.star.table.CellHoriJustify.CENTER

dispatcher.executeDispatch(document, ".uno:HorizontalAlignment", "", 0, args4())
End Sub
'======================================================================
но как-то коряво... курсор бегает по этим ячейкам....
а как сделать, чтоб не бегал за ними? 

2) А как потом очистить установленное форматирование всех ячеек таблицы (жирный, подчёркнутый текст, выравнивание по середине)?
Через clearContents не получается (вроде все параметры перебрал от 1 до 512).
Ну или отформатировать по образцу....

economist

Если по простому, то что-то типа такого так:
option vbasupport 1
Sub Main
[B10:B20].font.bold=True
[B10:B20].HorizontalAlignment = xlCenter
[A10:A20].ClearFormats
[A10:A20].ClearContents
End Sub

То есть используем ясный и простой синтаксис VBA в Calc (и Форумы по Excel для примеров).
Также полезен Макрорекордер в Excel. Макрорекордер в OpenOffice|LibreOffice - особенный, он пишет не все команды, а только те, что "ловит" прослойка под названием Диспетчер.

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

sokol92

Выделите ячейки на листе (можно даже несвязанные диапазоны) и примените следующий макрос.
Ссылки на документацию в тексте макроса.
Sub FormatSelection
  With ThisComponent.CurrentSelection
 
    ' Свойства символа https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1style_1_1CharacterProperties.html
    .CharWeight = com.sun.star.awt.FontWeight.SEMIBOLD   ' полужирный шрифт
    .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 ' выравнивание по горизонтали по середине
   
    ' Убираем все форматирование
       .clearContents com.sun.star.sheet.CellFlags.HARDATTR
 
  End With
End Sub
Владимир.

timal1234

Цитата: sokol92 от 27 марта 2024, 14:49Выделите ячейки на листе (можно даже несвязанные диапазоны) и примените следующий макрос.
Ссылки на документацию в тексте макроса.
Sub FormatSelection
  With ThisComponent.CurrentSelection
 
    ' Свойства символа https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1style_1_1CharacterProperties.html
    .CharWeight = com.sun.star.awt.FontWeight.SEMIBOLD  ' полужирный шрифт
    .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 ' выравнивание по горизонтали по середине
   
    ' Убираем все форматирование
      .clearContents com.sun.star.sheet.CellFlags.HARDATTR
 
  End With
End Sub


Большое Спасибо за ответ.
НО:
1) это сбрасывает шрифт, который я установил. Как его вернуть обратно?
2) после установки формата, почему-то не отображается, что текст в ячейке жирный ( не подсвечивается кнопка на панели)
------------
За ссылки СПАСИБО!
много раз заходил туда, но как пользоваться этим сайтом, так и не сообразил....  ???  очень запутанно сделано....

timal1234

Цитата: economist от 27 марта 2024, 14:35Если по простому, то что-то типа такого так:
option vbasupport 1
Sub Main
    [B10:B20].font.bold=True
    [B10:B20].HorizontalAlignment = xlCenter
    [A10:A20].ClearFormats
    [A10:A20].ClearContents
End Sub

То есть используем ясный и простой синтаксис VBA в Calc (и Форумы по Excel для примеров).
Также полезен Макрорекордер в Excel. Макрорекордер в OpenOffice|LibreOffice - особенный, он пишет не все команды, а только те, что "ловит" прослойка под названием Диспетчер.

Но и StarBasic учить надо, не везде VBA сработает.

Спасибо!
Попробую в крайнем случае, но хотелось без VBA  :)

sokol92

#5
Цитата: timal1234 от 27 марта 2024, 11:33А как потом очистить установленное форматирование всех ячеек таблицы (жирный, подчёркнутый текст, выравнивание по середине)?
Цитата: timal1234 от 27 марта 2024, 15:37это сбрасывает шрифт, который я установил. Как его вернуть обратно
То есть, Вы установили пользовательское форматирование ячейки и хотите часть элементов форматирования убрать, часть оставить. Тогда присвойте свойствам, которые Вы изменили, прежние значения (обычый (не полужирный) шрифт, выравнивание по умолчанию и т.д.)

Что касается кнопки жирного шрифта - хорошо, что Вы заметили. Измените в макросе SEMIBOLD на BOLD - кпопка должна появиться.
Владимир.

timal1234

Цитата: sokol92 от 27 марта 2024, 15:52
Цитата: timal1234 от 27 марта 2024, 11:33А как потом очистить установленное форматирование всех ячеек таблицы (жирный, подчёркнутый текст, выравнивание по середине)?
Цитата: timal1234 от 27 марта 2024, 15:37это сбрасывает шрифт, который я установил. Как его вернуть обратно

Что касается кнопки жирного шрифта - хорошо, что Вы заметили. Измените в макросе SEMIBOLD на BOLD - кпопка должна появиться.

Да, это я догадался .  ;D

timal1234

#7
Цитата: sokol92 от 27 марта 2024, 15:52
Цитата: timal1234 от 27 марта 2024, 11:33А как потом очистить установленное форматирование всех ячеек таблицы (жирный, подчёркнутый текст, выравнивание по середине)?
Цитата: timal1234 от 27 марта 2024, 15:37это сбрасывает шрифт, который я установил. Как его вернуть обратно
То есть, Вы установили пользовательское форматирование ячейки и хотите часть элементов форматирования убрать, часть оставить. Тогда присвойте свойствам, которые Вы изменили, прежние значения (обычый (не полужирный) шрифт, выравнивание по умолчанию и т.д.)
так свойства ячейкам (шрифт, высота, выравнивание) я присвоил вручную  :) без макроса ...
хотелось сделать аналог нажатия кнопок ( жирный, подчёркнутый, по центру) без сбрасывания остального формата ячейки....
я не знаю, как присвоить свойствам прежние значения...
если бы умел вернуть установленное мною форматирование через макрос - не спрашивал бы...   ;D

sokol92

    .CharWeight = com.sun.star.awt.FontWeight.NORMAL         ' обычный шрифт
    .CharUnderline = 0                                       ' нет подчеркивания (com.sun.star.awt.FontUnderline.NONE)

    .HoriJustify=com.sun.star.table.CellHoriJustify.STANDARD ' выравнивание по умолчанию
Если Вам надо (временно) поменять форматирование ячейки, то это можно сделать путем присвоения ей стиля.
Владимир.

timal1234

Цитата: sokol92 от 27 марта 2024, 14:49Выделите ячейки на листе (можно даже несвязанные диапазоны) и примените следующий макрос.
Ссылки на документацию в тексте макроса.
Sub FormatSelection
  With ThisComponent.CurrentSelection
 
    ' Свойства символа https://api.libreoffice.org/docs/idl/ref/servicecom_1_1sun_1_1star_1_1style_1_1CharacterProperties.html
    .CharWeight = com.sun.star.awt.FontWeight.SEMIBOLD  ' полужирный шрифт
    .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 ' выравнивание по горизонтали по середине
   
    ' Убираем все форматирование
      .clearContents com.sun.star.sheet.CellFlags.HARDATTR
 
  End With
End Sub


С небольшой доработкой Получилось!
Sub FormatSelection_SET
  With ThisComponent.CurrentSelection
 
    ' Свойства символа 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_CLEAR
  With ThisComponent.CurrentSelection
 
'  ' Убираем все форматирование
'    .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
 
  End With
End Sub
Спасибо !!!

timal1234

Цитата: 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
но всё равно огромное СПАСИБО !!!!

timal1234

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

sokol92

Замените в моем коде ThisComponent.CurrentSelection на конструкцию типа

ThisComponent.getSheets.getByName("Лист1").getCellRangeByName("A2:B8")
Владимир.

timal1234

Цитата: sokol92 от 27 марта 2024, 16:44Замените в моем коде ThisComponent.CurrentSelection на конструкцию типа

ThisComponent.getSheets.getByName("Лист1").getCellRangeByName("A2:B8")

а как получить такое имя "A2:B8"?
в своём макросе я использую "ThisComponent.getSheets.getByName("Лист1").getCellByPosition(i,j)"
я нашёл только .AbsoluteName, но это возвращает в формате "Sheet.$A$2" . Приходится обрезать.


sokol92

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