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

Posted

技术标签:

【中文标题】如何在 Excel VSTO 加载项中为 OnUndo 调用 C# 方法?【英文标题】:How to call a C# method for OnUndo in an Excel VSTO add-in? 【发布时间】:2016-12-22 08:28:17 【问题描述】:

我目前正在用 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 会清除撤消堆栈。本质上,您可以让您的代码更改某些内容,然后让用户执行您所做的更改。您可能必须解决此问题。 【参考方案1】:

你说得对,Application.OnUndoProcedure 参数必须是 VBA 宏。

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

为了将 VBA 宏从您的 VSTO 加载项注入工作簿,您可以 create an .xlam Excel Add-in 并将其与 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 函数您可以做任何您需要撤消上一次操作的操作。

【讨论】:

以上是关于如何在 Excel VSTO 加载项中为 OnUndo 调用 C# 方法?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# VSTO Word 加载项中在页码旁边设置页眉和页脚文本?

如何在WiX 3.11安装程序中为VSTO加载项部署创建注册表项

office插件安装完成后com加载项中vsto文件不加载

VSTO加载项:清单中的引用与下载的程序集的标识不匹配

Excel 2007 VSTO 加载项即使在成功安装后也不可见

VSTO:在 Excel 工作表上绘图