我正在尝试弄清楚为什么我不能从VB编写的VSTO外接程序运行名为的Microsoft Word宏。我能找到的每个参考资料都说你可以用一行代码来做到这一点:
Application.Run("MacroName")
宏本身是非常simple...it的,只是切换“输入时替换文本”设置(AutoCorrect.ReplaceText =非AutoCorrect.ReplaceText)。当从Word本身调用时,它可以完美地运行。该宏链接到normal.dotm模板,因此无论何时打开Word,它都可用。我正在使用Word功能区上的一个按钮,该按钮回调到一个函数,该函数反过来调用宏。
Public Function DisplayHelp(ByVal control As Office.IRibbonControl)
'On Error Resume Next
Dim wdApp As New Microsoft.Office.Interop.Word.Application
wdApp.Run("AC_Test")
UpdateLabel()
End Function
单击该按钮不会更改“替换文本”设置的状态。我在插件开发方面有点缺乏经验,所以欢迎您的建议。
谢谢
发布于 2018-06-02 20:25:27
在VSTO插件中,您不应该启动新的Word.Application。宏调用正在您看不到的Word的新实例中运行。它不是在运行VSTO外接程序的应用程序实例中运行,而是在您单击按钮的位置运行。
(此外,启动一个新的Word实例可能会留下正在运行的winword.exe的“孤立”实例,这些实例不会被清理(内存泄漏),因为您并没有像您所展示的那样处理/释放对象。)
为了从您的VSTO插件中寻址Word.Application,请使用Globals.ThisAddin.Application
。所以,举个例子:
Word.Application wdApp = Globals.ThisAddin.Application
wdApp.Run("AC_Test")
关于MSDN的文档材料中的引用:Global access to objects in Office projects和Program VSTO Add-ins
请注意,有时Word并不清楚宏的位置。在这种情况下,您可能需要包括宏的模块名称,甚至包含宏的dotm的完整路径。然而,这不太可能成为Normal.dotm的问题……
发布于 2018-06-02 06:44:48
确保在默认VBA模块中声明了VBA sub。您可以在Interop Between VBA and Visual Studio Office Solutions (VSTO)文章中阅读更多关于这方面的内容。
有时还有助于指定所有显式传递Type.Missing
作为默认值的参数。例如:
Application.Run("Test",
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing,
Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
请注意,您的VBA sub应该声明为public。
有关详细信息,请参阅Application.Run。
发布于 2021-12-27 10:13:32
也许有人会发现在ms project中创建和调用宏很有用(2016)
添加到引用Microsoft.Vbe.Interop并使用
using VBIDE = Microsoft.Vbe.Interop;
链接到项目
public Microsoft.Office.Interop.MSProject.Application app = new Microsoft.Office.Interop.MSProject.Application();
创建宏
private void button1_Click(object sender, RibbonControlEventArgs e)
{
StringBuilder sb;
sb = new StringBuilder();
sb.Append("Sub aaa()"+"\n");
sb.Append("Message \"m1\" " + "\n");
sb.Append("End Sub"+"\n");
VBIDE.VBComponent oModule;
oModule = app.Application.ActiveProject.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
oModule.Name = "PMP1";
oModule.CodeModule.AddFromString(sb.ToString());
sb.Clear();
sb.Append("Sub aaa2(ByVal word)" + "\n");
sb.Append("Message word " + "\n");
sb.Append("End Sub" + "\n");
sb.Append("\n");
sb.Append("Sub aaa3(ByVal word)" + "\n");
sb.Append("Message word " + "\n");
sb.Append("End Sub" + "\n");
oModule = app.Application.ActiveProject.VBProject.VBComponents.Add(VBIDE.vbext_ComponentType.vbext_ct_StdModule);
oModule.Name = "PMP2";
oModule.CodeModule.AddFromString(sb.ToString());
}
调用宏
app.Application.Run("aaa3", "test");
https://stackoverflow.com/questions/50650802
复制相似问题