Undo 是 Application 对象的方法,因此需要向它下手。我这有 3 个方案,哪个合适你自己选吧:
1、把调用宏的代码写在程序里,而不是写在 Excel 的 VBA 里,这样 Excel 不会记录 Undo 信息:
Application.Run('宏名');
或
Application.Run('宏名', 参数1, 参数2...);
缺点是宏的调用时机由你的程序控制,如果宏的运行是交互式的,就不方便了。
2、重新定位 Undo 方法,当 Undo 发生时,自动定位到指定的宏:
Application.OnUndo('禁止撤销', 'Kill_Undo_Sub');
在你的程序或者 VBA 中,调用宏之后写上面这句,一旦用户进行撤销就会调用 Kill_Undo_Sub 这个宏,撤销时想干什么都写到 Kill_Undo_Sub 里好了(如果 Kill_Undo_Sub 中什么都不写,可以使 Undo 完全失效)。
这个方法的好处是保证实时交互性,可以写到程序里,也可以写到 VBA 里(这时跟 Delphi 没什么关系了)。
3、禁止“撤销”按钮,禁止某个按钮的代码到处都是,再罗嗦一遍吧:
VBA —> Application.CommandBars("Standard"
.Controls(13).Enabled = False
Delphi —> Application.CommandBars['Standard'].Controls[13].Enabled := False;
这个方法简单粗暴,但是用 Ctrl + Z 就没辙了。