如何在Excel VSTO外接程序中调用OnUndo的c#方法
本文关键字:调用 OnUndo 方法 程序 Excel VSTO | 更新日期: 2023-09-27 18:02:43
我目前正在用c#为Excel编写一个VSTO插件,并且在使撤消功能正常工作方面遇到了麻烦。
据我所知,从文档中可以看出,您打算使用Application.OnUndo
来注册撤消回调。然而,我不清楚Procedure
参数是否有可能引用c#方法。
理想情况下,我想将撤消回调设置为实例方法,例如:
this.Application = Globals.ThisAddIn.Application;
// ...
this.Application.OnUndo("Undo color change", "this.UndoTextColorChange");
不幸的是,虽然这注册了撤消,但实际上在Excel中单击"撤消"会出现错误:
不能运行宏'this.UndoTextColorChange'。该宏可能在此工作簿中不可用,或者所有宏都已禁用。
对我来说,这几乎表明Procedure
参数必须是一个VB宏(而不是c#方法)。但是,也有可能我还没有能够计算出在.OnUndo
调用中使用的完全限定过程名称。
是否有可能让Application.OnUndo
调用c#方法?如果是这样,我应该用什么作为Procedure
的参数?如果没有,撤销功能在c# VSTO插件中通常是如何实现的?
您是对的,Application.OnUndo
的Procedure
参数必须是VBA宏。
如果你想让Application.OnUndo
调用c#方法,你必须在你的工作簿中添加一个VBA宏,它将由Application.OnUndo
触发。然后宏可以从VSTO外接程序调用c#代码。这里有一篇很好的文章,描述了如何从VBA宏调用VSTO代码。
为了从VSTO加载项注入VBA宏到工作簿中,您可以创建一个.xlam
Excel加载项并将其与VSTO加载项一起分发(基本上将其放入相同的文件夹中,甚至将其嵌入VSTO加载项本身作为资源文件)。
.xlam
Excel插件将是非常简单的,将包含一个函数,如下所示:
Sub UndoLastAction()
Application.COMAddIns("YourVSTOLibraryName").UndoInVSTO
End Sub
当VSTO插件启动时,它可以加载.xlam
插件,因此所有的工作簿都可以访问该VBA宏,即使工作簿本身没有启用宏。
下面是一个如何从VSTO加载.xlam
Excel插件的示例:
var undoManager = Globals.ThisAddIn.Application.AddIns.Add("UndoManager.xlam", true);
undoManager.Installed = true;
现在,当你通过VSTO插件执行一个特定的修改,然后希望能够撤销它,你将不得不调用Application.OnUndo
:
Globals.ThisAddIn.Application.OnUndo("Undo Last Operation", "UndoManager.xlam!UndoLastAction");
当执行Application.OnUndo
时,Excel将允许用户点击"撤消";按钮,它将触发.xlam
插件中声明的UndoLastAction
宏,它将触发YourVSTOLibraryName
dll中声明的UndoInVSTO
函数,您可以做任何您需要撤销上次操作的操作。