Установка внутренних границ в Calc'е

Автор eeigor, 24 июля 2022, 15:59

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

eeigor

Подскажите, как установить внутренние границы без диспетчера.


Sub SetBorderInnerVertical()
Dim document As Object
Dim dispatcher As Object

document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args(4) as new com.sun.star.beans.PropertyValue
args(0).Name = "BorderInner.Horizontal"
args(0).Value = Array(0, 0, 0, 0, 0, 0)
args(1).Name = "BorderInner.Vertical"
args(1).Value = Array(0, 18, 18, 4, 15, 2)
args(2).Name = "BorderInner.Flags"
args(2).Value = 2
args(3).Name = "BorderInner.ValidFlags"
args(3).Value = 127
args(4).Name = "BorderInner.DefaultDistance"
args(4).Value = 0

dispatcher.executeDispatch(document, ".uno:BorderInner", "", 0, args())
End Sub



Есть диапазон-источник oRange.
Мне нужно переопределить границу между столбцами ByName("J3:K" & nRows) с одинарной на двойную.
Где вот это BorderInner.Vertical - свойство, с которым работает диспетчер, и как его задать?


With oRange
nRows = .Rows.Count

oBorder = CreateUnoStruct("com.sun.star.table.BorderLine2")
With oBorder
.Color = RGB(0, 0, 0)  'black
.LineWidth = 2  '0,05 пт (hairline)
Rem .InnerLineWidth = 2
End With
.TopBorder = oBorder
.RightBorder = oBorder
.BottomBorder = oBorder
.LeftBorder = oBorder

' Redefine the border between tables.
oTarget = .getCellRangeByPosition(9, 0, 10, nRows - 1)  'ByName("J3:K" & nRows)
Rem ...
End With


Edit:
Пытаюсь задать одну границу (правую или левую) как двойную, но ничего не происходит (ниже для правой границы в левом столбце из данной пары).

oTarget = .getCellRangeByPosition(9, 0, 9, nRows - 1)  'ByName("J3:J" & nRows)
oBorder.LineStyle = com.sun.star.table.BorderLineStyle.DOUBLE
oTarget.RightBorder = oBorder

Но в окне формата ячейки (GUI) что-то происходит: сбивается настройка ширины линии (LineWidth) c 0,05 на 0,75, при этом толщина линии фактически, вроде, не меняется...

Впрочем, записанный макрос тоже не работает. Edit: Bug found.

oTarget = .getCellRangeByPosition(9, 0, 10, nRows - 1)  'ByName("J3:K" & nRows)
ThisComponent.CurrentController.select(oTarget)
Call SetBorderInnerVertical


Вообщем, просьба помочь установить двойную вертикальную линию между двумя ячейками макросом.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#1
Можно так (ширина границы):
Sub Test
 Dim oRange, oTableBorder, oVerticalLine
 oRange=ThisComponent.Sheets(0).GetCellRangeByName("B2:C3")
 oTableBorder=oRange.TableBorder2
 oTableBorder.IsVerticalLineValid=True
 oVerticalLine=oTableBorder.VerticalLine
 With oVerticalLine
   .LineWidth=79
   .OuterLineWidth=79
 End With
 oTableBorder.VerticalLine=oVerticalLine
 oRange.TableBorder2=oTableBorder
End Sub


Можно менять и другие элементы oVerticalLine.
Владимир.

eeigor

#2
@sokol92, спасибо. Я уже понял тоже (на Ask подсказали): надо сначала настроить 2 структуры: TableBorder2 и вложенную BorderLine2 (зд. меня интересует VerticalLine), а потом в обратном порядке присвоить это свойству диапазона TableBorder2. Была ещё одна особенность: css.table.BorderLineStyle.DOUBLE (3) не прошло, надо DOUBLE_THIN (15) – только этот выбор есть в выпадающем списке окна Формат.

Edit:
При копировании структуры из диапазона, как в вашем примере, большая часть настроек остаётся (IsVerticalLineValid = True). Я создавал структуру с нуля.

Через установку внешней границы попробую позже.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

#3
Я тоже постоянно забываю про специфику присвоения значений элементам структур. В VBA такой проблемы практически нет (поскольку практически нет структур, вместо них используются "обычные" объекты). Можно в VBA структуры создавать через пользовательские типы, которые, в свою очередь, имеют многочисленные ограничения.

В Вашей теме на Ask'e мы видим, что и змееведы также создают промежуточные структуры (?).
Владимир.