Надстройка Excel с бесшовной отменой: возможно?

Я рассматриваю возможность реализации надстройки Excel с использованием COM (не VBA), которая будет манипулировать данными на листе.

Мне понадобится эта надстройка для бесшовной интеграции со стеком отмены. Более конкретно:

  1. Любые изменения, которые эта надстройка вносит в данные, должны быть отменены пользователем (с помощью стандартного действия «Отменить»).
  2. Элементы в стеке отмены до выполнения действия надстройки должны быть сохранены.

В моем (хотя и поверхностном) исследовании до сих пор неясно, может ли Excel это допустить. Если этого не произойдет, это остановит шоу, и надстройка не будет иметь никакой ценности.

Мой вопрос: это возможно? Это скорее вопрос «да или нет», чем вопрос «как», так как мне нужно знать, начинаю ли я погоню за дикими гусями или нет. Тем не менее, любые указания о том, как это можно сделать, будут бонусом.


person kes    schedule 22.06.2011    source источник
comment
Используете ли вы для этого компонент, я использовал add-in express, и у меня это сработало.   -  person Johan    schedule 22.06.2011
comment
Да, рассматривая возможность использования экспресс-надстройки. Однако их демонстрационное приложение не поддерживает отмену и очищает стек отмен. Я пытаюсь выяснить, есть ли способ обойти это.   -  person kes    schedule 22.06.2011
comment
Вы можете спросить их, их служба поддержки достаточно отзывчива. По моему опыту, они обычно отвечают в течение 24 часов.   -  person Johan    schedule 22.06.2011


Ответы (3)


Кажется, что это невозможно в конце концов.

Метод Application.OnUndo очищает текущий стек отмен и размещает себя наверху.
Похоже, что больше ничего не связано с настройкой отмены.

Возможно.

Application.OnUndo регистрирует подпрограмму отмены для выполняемой в данный момент подпрограммы:

sub ImMakingChanges()
  cells(1,1).interior.color = vbyellow
  application.onundo "Undo the stupid color", "RemoveMyStupidChanges"
end sub

sub RemoveMyStupidChanges()
  cells(1,1).interior.colorindex = xlnone
end sub

Очевидно, что сохранение предыдущего состояния в дикой природе — это вообще кошмар. Но вот.

Кроме того, ваша подпрограмма отмены должна быть видна широкой публике, чтобы Excel мог ее найти и вызвать.

person GSerg    schedule 22.06.2011
comment
Application.OnUndo сохраняет текущий стек и добавляет к нему? - person kes; 22.06.2011

По-видимому, это невозможно, и нет планов по поддержке этого даже в Office 2013, согласно ответу сотрудника MSFT на этот поток.

person Upendra    schedule 17.02.2013

Кажется, это все-таки возможно

Это можно сделать, но вам придется написать довольно сложный обработчик Undo. Вот ссылка, которая подробно описывает
как: http://www.jkp-ads.com/Articles/UndoWithVBA01.asp

К счастью, у ссылки есть полный исходный код, и он выглядит железно, так что у вас не должно возникнуть проблем.
Я буду рад услышать, как/если это сработало для вас.

PS: вот та же ссылка на голландском языке: http://www.jkp-ads.com/Articles/UndoWithVBA01NL.asp

person Johan    schedule 23.06.2011
comment
Просмотрел код, это какая-то полностью настраиваемая очередь отмены. Это не может плавно заменить стек отмены по умолчанию или интегрироваться с ним. В этом вся суть вопроса. - person GSerg; 24.06.2011
comment
Точнее, используя стек этих классов, можно легко написать саб, который можно зарегистрировать с помощью Application.OnUndo, но действия пользователя все равно будут потеряны. - person GSerg; 24.06.2011