[Решено] Срабатывания макроса при изменении значения в ячейке

Автор Smol, 29 сентября 2019, 10:03

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

Smol

Доброго времени суток.
Прошу помощи, как заставить макрос срабатывать при изменении значения в ячейки "D4"?
файл-образец во вложении.
Перечитал "кучу" тем на форуме понять не могу.
Это третий макрос который я собрал с помощью форума, поэтому сильно не ругайте.




rami

Вы почти всё сделали, осталось назначить макрос нужному событию.

1. щёлкаете по ярлычку листа, в появившемся меню выбираете "События листа..."
2. в окошке "Назначить действие" выбираете "Содержимое изменено" и назначаете нужный макрос

Smol


luu

А как натравить запуск макроса только на изменение содержимого конкретной ячейки (диапазона)?
В том случае, когда макрос обрабатывает ячейки на этом же листе - начинается вакханалия ошибок, потому что событие случается при каждом шаге макроса и пытается снова его выполнить

bigor

Событие изменение листа, но сразу в макросе делать проверку какой диапазон изменен
Поддержать наш форум можно здесь

luu

Цитата: bigor от  7 марта 2024, 07:09Событие изменение листа, но сразу в макросе делать проверку какой диапазон изменен
А как это реализовать?

В поиске решения тоже приходил к такой мысли, но не понимаю, как регистрировать изменение конкретной ячейки внутри тела макроса?

bigor

Поддержать наш форум можно здесь

sokol92

Событие листа "Содержимое изменено" (OnChanged) вызывается при интерактивном изменении значения ячейки (ячеек) листа. Событие не вызывается, если ячейки изменены макросом или в результате пересчета формул.
Параметр, который передается макросу обработки события, - ячейка (SheetCell), диапазон ячеек (SheetCellRange), диапазоны ячеек (SheetCellRanges).

Если нужно отследить изменение значения ячейки, содержащей формулу, то можно прослушивать событие листа "Формулы изменены", которое вызывыется в конце пересчета ячеек листа. Неудобство - макрос обработки события не имеет параметра, который мог бы указать, какие именно ячейки изменены.
Альтернатива - использовать интерфейс XModifyBroadcaster, который позволяет отслеживать изменения значения конкретной ячейки (диапазона ячеек). Здесь уже отслеживаются все изменения: интерактивно, макросом, в результате пересчета формул.
Схема применения указана ниже для примера отслеживания изменения значения ячейки A1 первого листа текущего документа. Запустите макрос SetModifyListener для начала отслеживания.

Option Explicit
Global oModifyListener As Object

Sub SetModifyListener()
    If oModifyListener Is Nothing Then
      oModifyListener = createUnoListener("CellModify_","com.sun.star.util.XModifyListener")
      ThisComponent.Sheets(0).getCellRangeByName("A1").addModifyListener oModifyListener
    End If 
End Sub

Sub CellModify_modified(oEvent)
    Msgbox "Cell A1 Modified"
End Sub

Sub CellModify_disposing(oEvent)
End Sub
Владимир.

luu

Всем спасибо. Решено вот таким образом:

Макрос Main запускается при изменении ячейки с координатами (x1, y1)

Sub Test_Event (oEvent)
Dim x1, x2, y1, y2 As Integer
' xray oEvent
x1 =  oEvent.RangeAddress.StartRow
x2 =  oEvent.RangeAddress.EndRow
y1 = oEvent.RangeAddress.StartColumn
y2 = oEvent.RangeAddress.EndColumn
if x1=0 and x2=0 and y1=1 and y2=1 then
' Print "Макрос запущен"
Main
else
' Print "изменение не в нужном диапазоне"
Endif
End Sub