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