如何在Excel VSTO插件中调用C#方法以进行OnUndo操作?

6
我正在使用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 将清除撤销堆栈。实际上,您可以让代码更改某些内容,然后让用户撤销您所做的更改。您可能需要解决此问题。 - dgorti
1个回答

0

你说得对,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 Add-in中声明的UndoLastAction宏,该宏将触发在YourVSTOLibraryName dll中声明的UndoInVSTO函数,您可以在其中执行您需要撤消的上一个操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接