Не вопрос, а просто для информации, может кому-то поможет.
В экселе был скрипт для автоматического заполнения текущим временем ячеек на листе в той же строке, со сдвигом по столбцам:
Private Sub Worksheet_Change(ByVal Target As Range)
For Each cell In Target
If Not Intersect(cell, Range("A2:A900000")) Is Nothing Then
With cell.Offset(0, 8)
.Value = Now
.EntireColumn.AutoFit
End With
End If
If Not Intersect(cell, Range("H2:H900000")) Is Nothing Then
With cell.Offset(0, 2)
.Value = Now
.EntireColumn.AutoFit
End With
End If
Next cell
End Sub
(Правой кн м на листе - Просмотреть код - вставляется в код нужного листа).
Потребовалось воспроизвести аналогичный функционал в LibreOffice 6.2.8.2 Calc:
Через управление макросами создал модуль в Standard книги.ods и выше Sub Main вставил 2 функции:
Sub AddChartDataListener()
oCell1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("A2:A90000")
oListener = CreateUnoListener("MyApp_", "com.sun.star.chart.XChartDataChangeEventListener")
oCell1.addChartDataChangeEventListener(oListener)
oCell2 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("H2:H90000")
oListener2 = CreateUnoListener("MyApp_", "com.sun.star.chart.XChartDataChangeEventListener")
oCell2.addChartDataChangeEventListener(oListener2)
End Sub
Sub MyApp_chartDataChanged(oEvent)
oSel = ThisComponent.getCurrentSelection()
oCellAddress = oSel.getCellByPosition(0, 0).getCellAddress()
oSheet = ThisComponent.CurrentController.ActiveSheet()
if oCellAddress.Column = 0 Then
OffsetCell = oSheet.getCellByPosition(oCellAddress.Column + 8, oCellAddress.Row)
OffsetCell.Value = Now()
End If
if oCellAddress.Column = 7 Then
OffsetCell = oSheet.getCellByPosition(oCellAddress.Column + 2, oCellAddress.Row)
OffsetCell.Value = Now()
End If
End Sub
Затем правой кн м на листе - События листа. Событию "Содержимое изменено" назначен макрос AddChartDataListener.
(Безопасность выставлена в средний уровень: при открытии книги спрашивает, включать ли макросы).
Для изменяемых колонок I и J заранее выбрал формат дата+время. Есть нюанс. Когда задаётся адрес строки в автоматически заполняемой Now() ячейке из I или J: в варианте oCellAddress.Row макрос корректно реагирует на автовставку даты с помощью Ctrl+ж. Если же ячейка редактируется вручную, то результат появляется на следующей строке (а сдвиг по столбцам правильный).
Если сделать oCellAddress.Row-1, то при ручном вводе изменяется нужная ячейка, но при автовставке затирается значение строкой выше.