如果在执行宏时如何使OOo的撤销/重做正常工作?
这与我之前的问题有关:#853176
答案 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