如何在 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.OnUndo
的 Procedure
参数必须是 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加载项部署创建注册表项