Автор Тема: Пример макроса в LibreOffice Calc  (Прочитано 1881 раз)

Оффлайн alttester

  • Участник
  • *
  • Сообщений: 15
Не вопрос, а просто для информации, может кому-то поможет.
В экселе был скрипт для автоматического заполнения текущим временем ячеек на листе в той же строке, со сдвигом по столбцам:
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, то при ручном вводе изменяется нужная ячейка, но при автовставке затирается значение строкой выше.