Страницы: 1
RSS
UNDO не работает, если вырезаешь и вставляешь значения на листе
 
Всем привет!
Может кто-нибудь подсказать, почему UNDO не отменяет действие, если вырезать ячейку и вставить ее в другое место на листе, либо перетянуть ячейку на другое место? С этим как-то можно бороться?
Сам UNDO у меня реагирует на изменение листа и встроен в макрос Worksheet_Change.
 
susaninme, Вам не кажется что информации слегка маловато дано, чтоб что-то предположить. Обычно стек сбрасывается при измененийх внесенных макросом, но вы не выложили ни примера ни кода.
По вопросам из тем форума, личку не читаю.
 
Цитата
susaninme написал:
Сам UNDO у меня реагирует на изменение листа и встроен в макрос
если это работа макроса, то буфер может очищаться ДО попытки сделать Undo.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Цитата
susaninme написал:
Сам UNDO у меня реагирует на изменение листа и встроен в макрос
если это работа макроса, то буфер может очищаться ДО попытки сделать Undo.
undo у меня как раз настроен на действия пользователя, и меня смущает, что остальные действия с ячейками он отменяет, а именно ctrl+x даёт сделать
 
БМВ, попозже выложу, что я намудрил с  undo...
 
Дмитрий(The_Prist) Щербаков, БМВ, друзья, делюсь кодом и есть еще дополнение, которые выявил

код на листе книги следующий:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
        
'функция отмены любых изменений на листе, если эти изменения вносит пользователь
Call Block_Change(unBlock)

End Sub
unBlock - это переменная которая отслеживает, кто делает изменения, пользователь или макрос, и передается дальше в функцию:
Код
Function Block_Change(ByRef unBlock As Boolean)

    If unBlock = True Then
        With Application: .ScreenUpdating = unBlock: .EnableEvents = unBlock: End With
    Else
        With Application
        .EnableEvents = 0: .Undo: .EnableEvents = 1
        End With
    End If
    
End Function
запустил сейчас с меткой на входе в функцию и выявил странное поведение.
1 ситуация. если я ввожу какой-нибудь текст в ячейку или удаляю значение, то все срабатывает нормально, сперва реагирует лист на изменения, вызывает функцию и отменяет действие.
2 ситуация. перетаскиваю ячейку или вырезаю и вставляю, то по какой-то причине функция вызывается дважды и undo фактически отменяет undo, когда проходит дважды...
Изменено: susaninme - 08.12.2022 10:16:43
 
Цитата
susaninme написал:
по какой-то причине функция вызывается дважды
Правильно. Вы ведь два изменения делаете - убираете из одной ячейки и вставляете в другую
Напишите в чистом листе вот это
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Debug.Print Target.Address
End Sub

Поиграйтесь и посмотрите, что в окне Immediate (Контрл+G) написано будет
Скажи мне, кудесник, любимец ба’гов...
 
Цитата
написал:
Поиграйтесь и посмотрите, что в окне Immediate (Контрл+G) написано будет
спасибо за подсказку! теперь вот думаю, почему Worksheet_Change не видит первого действия по вырезанию ячейки... и можно ли это как-то победить
 
Кто такой unBlock у Вас в коде?
А так - можно флаг ставить

Цитата
susaninme написал:
почему Worksheet_Change не видит первого действия по вырезанию ячейки
Думаю, потому, что до момента вставки вырезанного Вы еще ничего на листе не сделали. Изменений-то никаких нет, только муравьи вокруг ячейки побежали. А вот в момент вставки происходят оба действия - и вырезание, и вставка
Изменено: _Boroda_ - 08.12.2022 12:03:53
Скажи мне, кудесник, любимец ба’гов...
Страницы: 1
Наверх