Lupp недавно создал пример электронной таблицы, которая использует макросы для этого поведения. Он размещен по адресу https://forum.openoffice.org/en/forum/viewtopic.php?t=43531#p431848.
Тем не менее, он отмечает в AskLO, что:
Это сомнительный подход к использованию "макросов" для этой цели. Решение применимо только к листам, которые не используют жесткое (прямое) форматирование ячеек ... На самом деле не рекомендуется!
Единственное хорошее решение было бы, если бы оно могло быть реализовано в LibreOffice. Но, как вы, возможно, прочитали в отчете об ошибке:
Разговор с одним из опытных разработчиков ... это не тривиальная задача. Это никогда не может быть реализовано.
Как упоминалось в моем ответе на тот же вопрос о AskLO, практическим решением является использование условного форматирования для добавления цвета к нечетным или четным строкам.
РЕДАКТИРОВАТЬ:
Чтобы воспроизвести пример Lupp с нуля, сначала перейдите в Инструменты -> Макросы -> Организовать макросы -> LibreOffice Basic. Найдите документ .ods, нажмите « Создать», чтобы создать новый модуль, и вставьте в него следующий код.
Global focusCellAddressGl As String, columnWithFocusCellGl As Long, rowWithFocusCellGl As Long
Function focusCell(Optional pCtrl) As Object
REM Concept by "uros", "Villeroy"
REM Responsible for this variant: Wolfgang Jäger
REM 2017-09-28 V0
On Error Goto eExit
If IsMissing(pCtrl) Then pCtrl = ThisComponent.CurrentController
If NOT pCtrl.SupportsService("com.sun.star.sheet.SpreadsheetView") Then Exit Function
Dim theSheet As Object, fC As Object, sheetNum As Long, sInfo As String, sInfoDelim As String
Dim vD, vDSplit, sInfoSplit
vD = pCtrl.ViewData
vDSplit = Split(vD, ";")
theSheet = pCtrl.ActiveSheet's(sheetNum)
sheetNum = theSheet.RangeAddress.Sheet
sInfo = vDSplit(sheetNum + 3)
REM For CellAddress.Row >= 8192 the "+" is used as the subdelimiter in ViewData. WHY?
If InStr(sInfo, "+")>0 Then
sInfoDelim = "+"
Else
sInfoDelim = "/"
End If
sInfoSplit = Split(sInfo, sInfoDelim)
fC = theSheet.GetCellByPosition(sInfoSplit(0), sInfoSplit(1))
focusCell = fC
eExit:
End Function
Function focusCellAddress(Optional pDummy)
On Error Goto eExit
If focusCellAddressGl="" Then onSelectionChanged(NULL)
focusCellAddress=focusCellAddressGl
eExit:
End Function
Function columnWithFocusCell(Optional pDummy)
On Error Goto eExit
If columnWithFocuscellGl=0 Then onSelectionChanged(NULL)
columnWithFocusCell=columnWithFocusCellGl
eExit:
End Function
Function rowWithFocusCell(Optional pDummy)
On Error Goto eExit
If rowWithFocuscellGl=0 Then onSelectionChanged(NULL)
rowWithFocusCell=rowWithFocusCellGl
eExit:
End Function
Sub onSelectionChanged(pEvent)
On Error Goto eExit
tFC=focusCell()
focusCellAddressGl=Split(tFC.AbsoluteName,".")(1)
With tFC.CellAddress
columnWithFocusCellGl=.Column+1
rowWithfocusCellGl=.Row+1
End With
specCell=tFC.Spreadsheet.GetCellByPosition(0,0)
specCell.String = tFC.AbsoluteName
eExit:
End Sub
Теперь щелкните правой кнопкой мыши вкладку текущего листа и выберите « События листа». Присвойте onSelectionChanged
"Выбор изменен".
Также создайте стиль cfFocusCross
с цветом фона.
Наконец, перейдите в Формат -> Условное форматирование -> Управление -> Добавить.
- Формула
OR(ROW(A1)=ROWWITHFOCUSCELL();COLUMN(A1)=COLUMNWITHFOCUSCELL())+N($A$1)*0
- Применить стиль
cfFocusCross
- Диапазон
A1:Z100