如何在 Excel VSTO 加载项中为 OnUndo 调用 C# 方法?

sap*_*api 6 c# excel vsto

我目前正在用 C# 为 Excel 编写 VSTO 加载项,但无法使撤消功能正常工作。

据我从文档中可以看出,您打算Application.OnUndo用来注册撤消回调。但是,我不清楚Procedure参数是否可以引用 C# 方法。


理想情况下,我想将撤消回调设置为实例方法,例如:

this.Application = Globals.ThisAddIn.Application;
// ...
this.Application.OnUndo("Undo color change", "this.UndoTextColorChange");
Run Code Online (Sandbox Code Playgroud)

不幸的是,虽然这会注册撤消,但实际上在 Excel 中单击“撤消”会出现错误:

无法运行宏“this.UndoTextColorChange”。宏在此工作簿中可能不可用,或者可能禁用了所有宏。

对我来说,这几乎表明Procedure参数必须是 VB 宏(而不是 C# 方法)。但是,也有可能我无法计算出在.OnUndo调用中使用的完全限定的过程名称。


是否可以Application.OnUndo调用 C# 方法? 如果是这样,我应该使用什么作为 的论点Procedure?如果不是,撤消功能通常如何在 C# VSTO 插件中实现?

Pet*_*pin 0

你是对的,Procedure的参数Application.OnUndo必须是 VBA 宏。

如果您希望Application.OnUndo调用 C# 方法,则必须将 VBA 宏添加到工作簿中,该宏将由Application.OnUndo. 然后,宏可以从 VSTO 外接程序调用 C# 代码。是一篇很好的文章,描述了如何从 VBA 宏调用 VSTO 代码。

为了从 VSTO 外接程序将 VBA 宏注入到工作簿中,您可以创建一个.xlamExcel 外接程序并将其与 VSTO 外接程序一起分发(基本上将其放入同一文件夹中,甚至将其嵌入到 VSTO 外接程序中)本身作为资源文件)。

Excel.xlam插件非常简单,包含一个函数,如下所示:

Sub UndoLastAction()
    Application.COMAddIns("YourVSTOLibraryName").UndoInVSTO
End Sub
Run Code Online (Sandbox Code Playgroud)

当 VSTO 外接程序启动时,它可以加载.xlam外接程序,因此即使工作簿本身未启用宏,所有工作簿都可以访问该 VBA 宏。

以下是如何从 VSTO 加载.xlamExcel 加载项的示例:

var undoManager = Globals.ThisAddIn.Application.AddIns.Add("UndoManager.xlam", true);
undoManager.Installed = true;
Run Code Online (Sandbox Code Playgroud)

现在,当您通过 VSTO 插件执行特定修改,然后希望能够撤消它时,您将必须调用Application.OnUndo

Globals.ThisAddIn.Application.OnUndo("Undo Last Operation", "UndoManager.xlam!UndoLastAction");
Run Code Online (Sandbox Code Playgroud)

执行时Application.OnUndo,Excel 将允许用户单击“撤消”按钮,这将触发加载项UndoLastAction中声明的宏,该宏将触发 dll中声明的函数,您可以在其中执行任何操作来撤消上一次操作。.xlamUndoInVSTOYourVSTOLibraryName