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