В моем событии изменения мне нужно перехватить старое значение ячейки, поэтому я использую Application.Undo. Однако у меня есть макрос, который вносит изменения, который, очевидно, очищает стек отмены, но по-прежнему полагается на остальные процедуры события изменения.
Не могу полагаться на событие изменения выбора, потому что, если пользователь уже включен ячейке, это Событие не срабатывает. Невозможно использовать скрытый / зеркальный лист, поскольку мое полное приложение строит эти листы на основе главного шаблона. Мне пришлось бы продублировать информацию для такого количества листов, которые пользователь создает из Мастера.
А использование «Далее при ошибке возобновления» - это глупый код.
Есть ли способ проверить Отмените стек или определите, было ли событие изменения вызвано взаимодействием с пользователем или моим макросом.
Вот быстрая демонстрация, чтобы показать проблему:
Sheet1 Code-Behind:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NewValue As String
Dim OldValue As String
On Error GoTo ErrorHandler
Application.EnableEvents = False
If Not Intersect(Target, Me.Range("F3")) Is Nothing Then
NewValue = Target.Value
Application.Undo
OldValue = Target.Value
Target.Value = NewValue
MsgBox "Changed from: " & OldValue & " to " & NewValue
End If
ErrorHandler:
If Err.Number > 0 Then MsgBox Err.Description
Application.EnableEvents = True
End Sub
Код стандартного модуля:
Option Explicit
Sub MacroTest()
'clears undo stack
Sheet1.Range("F3").Value = "Macro Run"
End Sub