在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方法,也不能实现连续撤销功能。

 

posted @ 2022-10-01 17:46  iCells  阅读(685)  评论(0编辑  收藏  举报