Форум поддержки пользователей LibreOffice, Apache OpenOffice

Главная категория => Calc => Тема начата: bsi от 24 января 2017, 11:01

Название: [Решено] Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 11:01
Сразу после открытия документа макрос не функционирует. Начинает работать только после первого запуска через Сервис-Макросы и т.д.
Навыков программирования в LO нет. Пример взят тут http://www.script-coding.com/OOo/OOo_HelloWorld.html (http://www.script-coding.com/OOo/OOo_HelloWorld.html). Файл во вложении.
Sub AddChartDataListener()
   oCell1 = ThisComponent.getSheets().getByIndex(0).getCellRangeByName("A2:A2")
   oListener = CreateUnoListener("MyApp_", "com.sun.star.chart.XChartDataChangeEventListener")
   oCell1.addChartDataChangeEventListener(oListener)
End Sub

Sub MyApp_chartDataChanged(oEvent)
   dCell = ThisComponent.getSheets().getByIndex(0).GetCellByPosition(0,1)
   ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("B2").Value = dCell.Value + 2
End Sub

Прошу пояснить что не так.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: JohnSUN от 24 января 2017, 11:18
Просто не сделал еще одно действие - не сказал офису, что при открытии этого документа нужно автоматически выполнить макрос AddChartDataListener

Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 11:54
Спасибо. Я только начал осваивать LO.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 12:18
А как быть если макросов несколько и все они должны работать после открытия документа?
Пример во вложении.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: JohnSUN от 24 января 2017, 12:34
Извини, смысл не уловил.
Одним махом запустить на выполнение пачку процедур? Ну, нужно записать отдельную процедуру, в которой вызвать каждую из нужных и именно её указать в событии "Документ открыт".
Но я просмотрел то, что ты вложил в прошлое сообщение и, честное слово, не понял зачем это всё запускать при открытии книги  ???
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 14:22
Не могу понять как в LO запустить процедуру на выполнение на определенное действие. В Excel есть Worksheet_SelectionChange(ByVal Target As Range), Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) и т.д. А как это делать в LO ?
Пример кода из Excel Private Sub Worksheet_Change(ByVal Target As Range)

    If Target.Cells.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("B6:B300")) Is Nothing Then
    With Application: .EnableEvents = False
    Target.Value = UCase(Target.Value)
    .EnableEvents = True: End With

End If

    If Target.Cells.Count > 1 Then Exit Sub
    If Not Intersect(Target, Range("F6:F300")) Is Nothing Then
    With Application: .EnableEvents = False
    Target.Value = .Proper(Target.Value)
    .EnableEvents = True: End With
  End If
 
Application.EnableEvents = False

For i = 6 To Range("F" & Rows.Count).End(xlUp).Row
If Cells(i, "G") <> 0 Then
Cells(i, "j") = Cells(i, "G") / 100 * Cells(i, "H") - (Cells(i, "G") / 100 * Cells(i, "H") * 0.13)
Cells(i, "I") = Cells(i, "G") - Cells(i, "J")
Else
Cells(i, "j") = ""
Cells(i, "I") = ""
Cells(i, "H") = ""
End If
Next
Application.EnableEvents = True
End Sub

Как примерно такое осуществить в LO ?
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: JohnSUN от 24 января 2017, 14:42
А, в этом смысле! Здесь они тоже есть. Только имена для процедур-обработчиков не обязательно должны быть именно такими, жёстко предопределёнными - процедура может называться как угодно. Главное, чтобы у неё был один параметр - тот самый event, который вызвал событие.
А назначить эту процедуру на определённое событие просто - щёлкни правой кнопкой на ярлычке листа и выбери События листа.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: economist от 24 января 2017, 15:11
В некоторых версиях офиса макросы на события открытия не стартовали из-за Design Mode, действовавшего при закрытии документа.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 15:45
Что-то у меня не получается. Может я что-то не так объясняю. Давай на конкретном примере. Во вложении файл. В коде две процедуры MyApp_chartDataChanged и Schot.  AddChartDataListener() назначено на открытие документа. Открываю документ, в ячейке А2 меняю содержимое, перехожу на другую ячейку, в ячейке В2 результат изменился, MyApp_chartDataChanged - сработал. Далее надо, чтобы при изменении значения в В3 сработал Schot (красные цифры). Пробовал назначить Schot на щёлкни правой кнопкой на ярлычке листа и выбери События листа, не работает.
Извини, что наверное достал тебя, но хочется разобрать с этим LO.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: JohnSUN от 24 января 2017, 16:13
Цитата: bsi от 24 января 2017, 15:45
Извини, что наверное достал тебя, но хочется разобрать с этим LO.
Достал, конечно, но не ты - гвалт вокруг стоит, сосредоточиться невозможно
Ты пытаешься повторить функционал того VBA-макроса?
При каждом изменении ячейки из предопределенного диапазона (в твоем примере это были "B6:B300", "F6:F300" и все ячейки в колонке G, для которых что-то было в этой же строке в колонке F и не ноль в G) нужно выполнять разные действия: для колонки B - перевести текст в верхний регистр, для F - Каждое Слово С Прописной, для G - пересчитать или очистить I,G,H.
Ну, в смысле - для разных колонок разные действия, но всё это - на одном событии, на изменении данных листа. Так?
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: rami от 24 января 2017, 16:32
Цитата: bsi от 24 января 2017, 13:45Открываю документ, в ячейке А2 меняю содержимое, перехожу на другую ячейку, в ячейке В2 результат изменился, MyApp_chartDataChanged - сработал. Далее надо, чтобы при изменении значения в В3 сработал Schot (красные цифры).
При открытии документа срабатывает макрос AddChartDataListener, который назначает слушателя на одну единственную ячейку A2, на других ячейках слушатель работать не будет.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 16:38
ЦитироватьНу, в смысле - для разных колонок разные действия, но всё это - на одном событии, на изменении данных листа. Так?
Да.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: JohnSUN от 24 января 2017, 17:13
Ну, вот один из вариантов.
Если честно, то мне такое решение очень не нравится. Добавь строку выше этих ячеек или столбец левее - и макрос будет обрабатывать совсем не то, что хотелось.
Поэтому я предпочитаю другой подход: создаю стиль с каким-нибудь подходящим именем (например, toAdd2), а в макросе анализирую имя стиля ячейки из oEvent. Тогда по всему листу можно набросать сколько угодно ячеек в разных местах с одним стилем и все они будут однотипно обрабатываться одним макросом.
Название: Re: Макрос не начинает функционировать сразу после открытия документа
Отправлено: bsi от 24 января 2017, 17:18
ЦитироватьНу, вот один из вариантов.
Огромное спасибо, буду разбираться.