我目前正在用 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 插件中实现?
你是对的,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
| 归档时间: |
|
| 查看次数: |
340 次 |
| 最近记录: |