Временное отключение обработчика событий на листе

Автор Sirius34, 17 сентября 2024, 10:39

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

Sirius34

Всем доброго времени суток!

В процессе работы макроса на одной из вкладок происходит считывание значений из определенных ячеек.
К этой вкладке привязан обработчик событий oSelectionChange.
С непонятной мне периодичностью этот обработчик срабатывает (сорри за тавтологию), хотя физически именно на этой вкладке никаких изменений и движения курсора не происходит.
Пусть выполнение скрипта обработчика и не занимает много времени, буквально секунда-полторы, но всё-таки не очень это правильно...

Можно ли как-то временно его отключить / деактивировать?

Поиск в сети ничего определенного не дал.
На данном форуме, правда, нашёл очень древний топик с аналогичным вопросом, но там пришли к варианту решения проблемы с глобальной переменной, что, кмк, не очень удобно...

mikekaganski

Если обработчик вызывается без самого события, это баг.
С уважением,
Михаил Каганский

sokol92

Цитата: Sirius34 от 17 сентября 2024, 10:39Можно ли как-то временно его отключить / деактивировать?
Если речь идет об обработчике события листа электронной таблицы, то этот обработчик можно добавлять и удалять из макроса.
Владимир.

Sirius34

Цитата: sokol92 от 17 сентября 2024, 13:56Если речь идет об обработчике события листа электронной таблицы, то этот обработчик можно добавлять и удалять из макроса.
У меня на один из листов на событие "Выбранная область изменена" привязан макрос-обработчик.
Во время работы другого макроса обработчик периодически срабатывает.
Удалять, наверное, неправильно. Или речь идёт про "отвязать / привязать макрос к событию", если это можно сделать другим макросом?

Sirius34

Цитата: mikekaganski от 17 сентября 2024, 10:59Если обработчик вызывается без самого события, это баг.
Попробовал оттрассировать. Почему-то все сработки пришлись на обращение к другим листам (не к привязанному)
.getByName
.hasByName
.isVisible
.importSheet
.removeByName

economist

Ложняки на Select-ы неистребимы, и в Excel их полно. Причем они появляются не сразу, а спустя часы работы в одном файле.

Надо в коде по событию в первых строках определять контекст и если он "левый" -  делать Exit. И вполне можно с этим жить.

Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Владимир.

sokol92

#7
Вроде бы нашел подходящий макрос динамического подключения / отключения макроса Basic для обработки события объекта (документа, листа, ...)
' --------------------------------------------------------------------------------------------------------------------------------------
' lang:en
' Set up a macro to handle the event of an object.
' Parameters:
' obj      object (for example, document).
' eventName name of the event.
' macroName name of the macro: Library.Module.Macro. If an empty string is specified, then
'          the macro for handling the event is
'          reset. The prefix "*" must be specified before the application library.
'
' lang:ru
' Устанавливает макрос для обработки события объекта.
' Параметры:
' obj объект (например, документ).
' eventName имя события.
' macroName имя макроса в виде Library.Module.Macro. Если указана пустая строка, то макрос для обработки события сбрасывается. Перед
'          библиотекой приложения нужно указать префикс "*".
'
Sub Events_SetMacro(ByVal obj, ByVal eventName As String, ByVal macroName As String)
  Dim oEvents As Object, location As String
  Dim props(1) As New com.sun.star.beans.PropertyValue
  Const ScriptUri As String="vnd.sun.star.script:"
 
  If left(macroName, 1)="*" Then
    location="application"
    macroName=Mid(macroName, 2)
  Else
    location="document"
  End If   

  oEvents=obj.Events
  If macroName="" Then
    oEvents.replaceByName(eventName, Empty)
  Else
    props(0).Name="EventType"
    props(0).Value="Script"
    props(1).Name="Script"
    props(1).Value=ScriptUri & macroName & "?language=Basic&location=" & location
    oEvents.replaceByName eventName, props
  End If 
End Sub


Вот так можно попробовать (занести в модуль Module1 библиотеки документа Standard):
Sub OnSelect()
  Msgbox "OnSelect"
End Sub

Sub Test
  Events_SetMacro ThisComponent.Sheets(0), "OnSelect", "Standard.Module1.OnSelect" ' заносим обработчик OnSelect
  'Events_SetMacro ThisComponent.Sheets(0), "OnSelect", ""   ' отключаем обработчик

End Sub

Владимир.