[Решено] Макрос не начинает функционировать сразу после открытия документа

Автор bsi, 24 января 2017, 11:01

0 Пользователи и 1 гость просматривают эту тему.

bsi

Сразу после открытия документа макрос не функционирует. Начинает работать только после первого запуска через Сервис-Макросы и т.д.
Навыков программирования в LO нет. Пример взят тут 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

Прошу пояснить что не так.

JohnSUN

Просто не сделал еще одно действие - не сказал офису, что при открытии этого документа нужно автоматически выполнить макрос AddChartDataListener

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bsi


bsi

А как быть если макросов несколько и все они должны работать после открытия документа?
Пример во вложении.

JohnSUN

Извини, смысл не уловил.
Одним махом запустить на выполнение пачку процедур? Ну, нужно записать отдельную процедуру, в которой вызвать каждую из нужных и именно её указать в событии "Документ открыт".
Но я просмотрел то, что ты вложил в прошлое сообщение и, честное слово, не понял зачем это всё запускать при открытии книги  ???
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bsi

Не могу понять как в 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 ?

JohnSUN

А, в этом смысле! Здесь они тоже есть. Только имена для процедур-обработчиков не обязательно должны быть именно такими, жёстко предопределёнными - процедура может называться как угодно. Главное, чтобы у неё был один параметр - тот самый event, который вызвал событие.
А назначить эту процедуру на определённое событие просто - щёлкни правой кнопкой на ярлычке листа и выбери События листа.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

economist

В некоторых версиях офиса макросы на события открытия не стартовали из-за Design Mode, действовавшего при закрытии документа.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bsi

Что-то у меня не получается. Может я что-то не так объясняю. Давай на конкретном примере. Во вложении файл. В коде две процедуры MyApp_chartDataChanged и Schot.  AddChartDataListener() назначено на открытие документа. Открываю документ, в ячейке А2 меняю содержимое, перехожу на другую ячейку, в ячейке В2 результат изменился, MyApp_chartDataChanged - сработал. Далее надо, чтобы при изменении значения в В3 сработал Schot (красные цифры). Пробовал назначить Schot на щёлкни правой кнопкой на ярлычке листа и выбери События листа, не работает.
Извини, что наверное достал тебя, но хочется разобрать с этим LO.

JohnSUN

Цитата: bsi от 24 января 2017, 15:45
Извини, что наверное достал тебя, но хочется разобрать с этим LO.
Достал, конечно, но не ты - гвалт вокруг стоит, сосредоточиться невозможно
Ты пытаешься повторить функционал того VBA-макроса?
При каждом изменении ячейки из предопределенного диапазона (в твоем примере это были "B6:B300", "F6:F300" и все ячейки в колонке G, для которых что-то было в этой же строке в колонке F и не ноль в G) нужно выполнять разные действия: для колонки B - перевести текст в верхний регистр, для F - Каждое Слово С Прописной, для G - пересчитать или очистить I,G,H.
Ну, в смысле - для разных колонок разные действия, но всё это - на одном событии, на изменении данных листа. Так?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Цитата: bsi от 24 января 2017, 13:45Открываю документ, в ячейке А2 меняю содержимое, перехожу на другую ячейку, в ячейке В2 результат изменился, MyApp_chartDataChanged - сработал. Далее надо, чтобы при изменении значения в В3 сработал Schot (красные цифры).
При открытии документа срабатывает макрос AddChartDataListener, который назначает слушателя на одну единственную ячейку A2, на других ячейках слушатель работать не будет.

bsi

ЦитироватьНу, в смысле - для разных колонок разные действия, но всё это - на одном событии, на изменении данных листа. Так?
Да.

JohnSUN

Ну, вот один из вариантов.
Если честно, то мне такое решение очень не нравится. Добавь строку выше этих ячеек или столбец левее - и макрос будет обрабатывать совсем не то, что хотелось.
Поэтому я предпочитаю другой подход: создаю стиль с каким-нибудь подходящим именем (например, toAdd2), а в макросе анализирую имя стиля ячейки из oEvent. Тогда по всему листу можно набросать сколько угодно ячеек в разных местах с одним стилем и все они будут однотипно обрабатываться одним макросом.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

bsi

ЦитироватьНу, вот один из вариантов.
Огромное спасибо, буду разбираться.