如何在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插件中通常是如何实现的?

如何在Excel VSTO外接程序中调用OnUndo的c#方法

您是对的,Application.OnUndoProcedure参数必须是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函数,您可以做任何您需要撤销上次操作的操作。