在VSTO项目中使用Excel的撤销功能(二)
在上一篇中已经实现了在VSTO中调用VBA工程中的过程来实现撤销功能,OnUnDO函数必须是调用VBA中的过程名,如果每一个撤销的过程都需要放入到VBA中去实现,不仅繁琐,还失去了VSTO开发插件的意义。其实可以通过VSTO调用一个固定的VBA,再通过VBA来调用VSTO内撤销过程的方法来实现,核心在于VBA如何调用VSTO中的过程,其实现过程如下:
一、在ExcelAddIn1项目中新建一个类,类名称Rollback,并放入以下代码:
1 Imports System.Runtime.InteropServices
2 <ComVisible(True)>
3 Public Interface IAddInUtilities
4 Sub Undo(str As String)
5 End Interface
6 <ComVisible(True)>
7 <ClassInterface(ClassInterfaceType.None)>
8 Public Class Rollback
9 Implements IAddInUtilities
10 Public Sub Undo(str As String) Implements IAddInUtilities.Undo
11 Globals.ThisAddIn.Application.ActiveSheet.Range("A1").Value = str
12 End Sub
13 End Class
以上代码的作用是向Excel公开VSTO中的Undo方法,Undo方法实现了撤销的具体过程。
二、在ThisAddIn中插入以下代码:
1 Private utilities As Rollback
2 Protected Overrides Function RequestComAddInAutomationService() As Object
3 If utilities Is Nothing Then
4 utilities = New Rollback()
5 End If
6 Return utilities
7 End Function
以上代码的作用是公开Rollback类的实例。
三、在iCells_Undo.xlam加载宏VBA工程中模块中,把具体的撤销过程改为以下代码:
1 '在VBA中调用Vsto的函数示例
2 Sub Undo(str As String)
3 Dim addIn As COMAddIn
4 Dim automationObject As Object
5 Set addIn = Application.COMAddIns("ExcelAddIn1")
6 Set automationObject = addIn.Object
7 automationObject.Undo (str)
8 End Sub
最后运行项目,点击“A1单元格赋值”按钮,A1被赋值“iCells”,撤销按钮亮起。
点击撤销按钮,A1单元格被赋值为原来的空值,撤销按钮不可用。
借助加载宏和OnUndo方法实现了在VSTO项目中的撤销功能,但是OnUndo方法有缺点,只能撤销最后一步,原因是当Excel运行任何代码后,撤销栈会被清除,就算是在撤销过程后继续调用OnUndo方法,也不能实现连续撤销功能。