如何使宏“原子”

时间:2009-05-12 15:29:44

标签: macros openoffice.org atomic

如果在执行宏时如何使OOo的撤销/重做正常工作?

这与我之前的问题有关:#853176

4 个答案:

答案 0 :(得分:1)

对于那些喜欢使用JavaScript来编写OOo宏的人,这里有一个应该工作的最小片段(它经过测试但是我从更大的上下文中隔离了这个代码):

importClass( Packages.com.sun.star.document.XUndoManager );
importClass( Packages.com.sun.star.document.XUndoManagerSupplier );
var doc           = XSCRIPTCONTEXT.getDocument();
var undo_manager  = UnoRuntime.queryInterface(XUndoManagerSupplier, doc).getUndoManager();
undo_manager.enterUndoContext( 'your descriptive title here' ); 
// get stuff done
undo_manager.leaveUndoContext(); 

答案 1 :(得分:0)

在Word中,这可以通过在宏的开头向文档添加书签来实现,然后在宏完成时将其删除。调用 Undo 时,会检查是否存在此类特殊书签,并重复撤消操作,直到从文档中删除特殊书签为止。

我假设类似的方法也适用于OpenOffice.org。

有关详细信息,请参阅Can I create an undo transaction in Word or Excel? (VSTO)

答案 2 :(得分:0)

您可以与UndoManager对话,在宏的最开头调用enterUndoContext(),然后在结尾调用leaveUndoContext()。例如:

Dim undo As Object
undo = ThisComponent.UndoManager
undo.enterUndoContext("MyAtomicTest")
...
[YOUR COMPLEX OPERATIONS HERE]
...
undo.leaveUndoContext

这会创建一个原子撤消操作,对用户显示为“MyAtomicTest”。

答案 3 :(得分:0)

自2018年(Office 365)起,Make VBA code undo in one step的解决方案运行正常。 在Microsoft网站上也看到了相同的解决方案,但我现在无法找到该引用。

Sub YourMacroName
    Dim objUndo As UndoRecord 
    Set objUndo = Application.UndoRecord 
    objUndo.StartCustomRecord ("Your unique string - e.g. the macro name")
    ' your multi-step macro goes here
    objUndo.EndCustomRecord
End Sub