首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从vsto调用word宏

从vsto调用word宏
EN

Stack Overflow用户
提问于 2018-06-02 04:47:48
回答 3查看 314关注 0票数 1

我正在尝试弄清楚为什么我不能从VB编写的VSTO外接程序运行名为的Microsoft Word宏。我能找到的每个参考资料都说你可以用一行代码来做到这一点:

代码语言:javascript
复制
Application.Run("MacroName")

宏本身是非常simple...it的,只是切换“输入时替换文本”设置(AutoCorrect.ReplaceText =非AutoCorrect.ReplaceText)。当从Word本身调用时,它可以完美地运行。该宏链接到normal.dotm模板,因此无论何时打开Word,它都可用。我正在使用Word功能区上的一个按钮,该按钮回调到一个函数,该函数反过来调用宏。

代码语言:javascript
复制
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

单击该按钮不会更改“替换文本”设置的状态。我在插件开发方面有点缺乏经验,所以欢迎您的建议。

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-02 20:25:27

在VSTO插件中,您不应该启动新的Word.Application。宏调用正在您看不到的Word的新实例中运行。它不是在运行VSTO外接程序的应用程序实例中运行,而是在您单击按钮的位置运行。

(此外,启动一个新的Word实例可能会留下正在运行的winword.exe的“孤立”实例,这些实例不会被清理(内存泄漏),因为您并没有像您所展示的那样处理/释放对象。)

为了从您的VSTO插件中寻址Word.Application,请使用Globals.ThisAddin.Application。所以,举个例子:

代码语言:javascript
复制
 Word.Application wdApp = Globals.ThisAddin.Application
 wdApp.Run("AC_Test")

关于MSDN的文档材料中的引用:Global access to objects in Office projectsProgram VSTO Add-ins

请注意,有时Word并不清楚宏的位置。在这种情况下,您可能需要包括宏的模块名称,甚至包含宏的dotm的完整路径。然而,这不太可能成为Normal.dotm的问题……

票数 0
EN

Stack Overflow用户

发布于 2018-06-02 06:44:48

确保在默认VBA模块中声明了VBA sub。您可以在Interop Between VBA and Visual Studio Office Solutions (VSTO)文章中阅读更多关于这方面的内容。

有时还有助于指定所有显式传递Type.Missing作为默认值的参数。例如:

代码语言:javascript
复制
 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

票数 0
EN

Stack Overflow用户

发布于 2021-12-27 10:13:32

也许有人会发现在ms project中创建和调用宏很有用(2016)

添加到引用Microsoft.Vbe.Interop并使用

代码语言:javascript
复制
using VBIDE = Microsoft.Vbe.Interop;

链接到项目

代码语言:javascript
复制
 public Microsoft.Office.Interop.MSProject.Application app = new Microsoft.Office.Interop.MSProject.Application();

创建宏

代码语言:javascript
复制
      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());
        }

调用宏

代码语言:javascript
复制
 app.Application.Run("aaa3", "test");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50650802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档