Построение отмены в макрос Excel VBA

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

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

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


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

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

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

C22 value  3
C22 format general

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

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

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

к сожалению, это не очень хорошо интегрируется с "реальной" отменой, но я не думаю, что есть какой-либо способ обойти это.