Изменение байпаса рабочего листа VBA?

Я фиксирую таблицу. Программист сделал макрос для каждого листа, чтобы стрелять, когда лист изменен. Это хорошо, потому что цвет координирует детали листа при добавлении новой информации, поэтому я хотел бы сохранить эту функцию.

Я написал макрос, который сортирует данные и позволяет удалять и добавлять новых сотрудников, это противоречит макросу события изменений и вызывает у моего макроса ошибки, если они оба работают.

Q. Есть ли способ обойти событие изменения рабочего листа во время работы макроса, а затем снова установить его на место после завершения макроса?

Вот код для события изменения.

Private Sub Worksheet_Change(ByVal target As Excel.Range, skip_update As Boolean)
If skip_update = False Then
    Call PaintCell(target)
End If
End Sub

Мой макрос вызывает ошибки, когда я ссылаюсь на рабочие листы или диапазоны.

Ответ 1

Я думаю, что вы хотите свойство EnableEvents объекта Application. Когда вы устанавливаете EnableEvents в False, то ваш код не будет запускать какие-либо события, и никакой другой код не будет запущен. Например, если ваш код изменяет ячейку, он обычно вызывает событие Change или SheetChange. Однако, если вы структурируете это так

Application.EnableEvents = False
    Sheet1.Range("A1").Value = "new"
Application.EnableEvents = True

то изменение А1 не вызовет никаких событий.

Иногда полезно, чтобы ваш код запускал код события, а иногда нет. Используйте EnableEvents, если хотите предотвратить это.

Ответ 2

Это важная модификация ответа от @Dick Kusleika.

При отключении параметра EnableEvents рекомендуется включить обработку ошибок, чтобы включить EnableEvents. Если вы этого не сделаете, и script выдает сообщение об ошибке, триггер события изменения (ваш script) перестанет работать, пока вы снова не включите EnableEvents вручную.

В идеале вы должны поместить следующую строку непосредственно перед любым кодом, который повторно инициировал ваше событие изменения. Первая строка сообщает VBA, чтобы получить метку под названием "enableEventsOn", когда она встречает ошибку. Вторая строка обходит события изменения.

On Error Goto enableEventsOn:
Application.EnableEvents = False

Затем поместите этот код сразу после кода, который запустил ваше событие изменения. Это событие смены события запускается снова и возвращает нормальную обработку ошибок на ваш script.

Application.EnableEvents = True
On Error Goto 0

Наконец, поместите этот код в конец вашего script. Это ярлык, упомянутый выше. Если возникла ошибка между "On Error Goto enableEventsOn:" и "On Error Goto 0", тогда script перейдет сюда и включит EnableEvents, оставив его готовым к запуску script при следующем изменении рабочего листа.

enableEventsOn:
Application.EnableEvents = True

Ответ 3

Слишком рискованно по моему мнению.

Я бы использовал переменную с именем "skip_update", которая установлена ​​в "Истина" в начале каждого макроса, а затем - false, когда она заканчивается.

например:

dim skip_update as Boolean = False

sub auto_macro_when_modify()
   if skip_update == True then
      exit sub ' NO CHANGE !
   end if
end sub

sub other_macro
    skip_update = True
    ' ( do stuff)
    skip_update = False
end sub

Ответ 4

Вы можете удерживать клавишу CTRL, выполняя запись, которая вызовет изменение в процедуре событий. У меня есть подпрограмма, чтобы суммировать значения в выбранном диапазоне в данном столбце. Если я перетаскиваю курсор из строк с 1 по 5, выделяя их, тогда их сумма сохраняется в буфер обмена. Любая запись в ячейке в этом столбце вызывает процедуру. Если я удерживаю клавишу CTRL, выполняя намеченное действие или любую запись в ячейке в столбце, процедура не запускается. Может не работать для более сложных сценариев ChangeEvent.