Worksheet_Change: запускается пользователем или макросом - PullRequest
0 голосов
/ 21 июня 2020

В моем событии изменения мне нужно перехватить старое значение ячейки, поэтому я использую 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

1 Ответ

0 голосов
/ 21 июня 2020

Пропустить шаг после «NewValue = Target.Value». Добавьте лог c между этими строками:

    NewValue = Target.Value
    On Error Resume Next ' Add this line of code
    Application.Undo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...