Создание отмены в макросе Excel VBA

Макросы Excel не позволяют использовать «отмену» после их запуска. Есть ли способ встроить undo функциональность в макрос VBA в Excel?


person Community    schedule 04.12.2008    source источник


Ответы (3)


В Excel VBA для этого есть функция Application.OnUndo:

Public Sub DoSomething

    ... do stuff here

    Application.OnUndo "Undo something", "UnDoSomething"
End Sub

Public Sub UnDoSomething

    ... reverse the action here

End Sub
person e.James    schedule 04.12.2008
comment
Хотя это поможет отменить действия первой подпрограммы, к сожалению, вы все равно потеряете историю отмененных действий, которые могли быть доступны до запуска подпрограммы. Если кто-нибудь знает, как решить эту проблему, это будет настоящим подарком. - person Excel Developers; 12.02.2014
comment
@ExcelDevelopers, вы имеете в виду, например, здесь - person Reafidy; 28.10.2017
comment
@Reafidy, не совсем так, поскольку это решение сохраняет только историю отмены для изменений, сделанных VBA, а не изменений, сделанных пользователем. - person Gregor y; 26.06.2018
comment
Изменения, внесенные пользователем, можно отменить с помощью ctrl-z. - person Reafidy; 01.07.2018
comment
@Reafidy: не после того, как код VBA внес свои собственные изменения в состояние книги. - person pstraton; 28.04.2021

Моя мысль довольно проста, поскольку первая строка в вашем макросе сохраняет копию в каталоге резервных копий, затем закрывает эту книгу и повторно открывает оригинал. Если вам не нравятся результаты выполнения макроса, откройте сохраненную книгу. Будь проще, а?

person CABecker    schedule 23.12.2008

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

Включив его в фактический макрос, вам придется в основном записывать старое состояние всего, что изменяется (содержимое ячеек, формулы, форматирование и т. Д.) В списке, а затем иметь макрос отмены, который воспроизводит этот список в обратном порядке.

Например, если ваш макрос изменяет содержимое ячейки C22 с «3» на «7» и форматирует с «общего» на «число, 2 десятичных знака», ваш список будет выглядеть следующим образом:

C22 value  3
C22 format general

Воспроизведение этого в обратном порядке (с другим макросом) приведет к отмене изменений.

У вас может быть целый дополнительный лист для хранения информации об отмене макроса, например:

Step   Cell   Type    Value
----   ----   -----   -------
   1   C22    value         3
       C22    format  general
   2...

К сожалению, это не очень хорошо сочетается с «настоящей» отменой, но я не думаю, что есть способ обойти это.

person paxdiablo    schedule 04.12.2008