从 vsto 调用的单词宏

word macro called from vsto

我想弄清楚为什么我不能 运行 从用 VB 编写的 VSTO 加载项调用的 Microsoft Word 宏。我能找到的每份参考资料都说你可以用一行代码做到这一点:

Application.Run("MacroName")

宏本身非常简单...它只是切换 'replace text as you type' 设置(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

单击该按钮不会更改替换文本设置的状态。我在加载项开发方面有些缺乏经验,因此非常感谢任何建议。

谢谢

确保在默认 VBA 模块中声明了 VBA 子模块。您可以在 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 潜艇应声明为 public。

有关详细信息,请参阅 Application.Run

在 VSTO 加载项中,您不应启动新的 Word.Application。在您没有看到的这个新的 Word 实例中,宏调用是 运行。它不是 运行 在你的 VSTO 加载项是 运行 的应用程序实例中,你单击按钮的地方。

(此外,像现在这样启动一个新的 Word 实例可能会留下 winword.exe 运行 的 "orphaned" 个实例,这些实例没有被清理(内存泄漏),因为你'就您向我们展示的而言,这不是 handling/releasing 对象。)

为了从您的 VSTO 加载项中解决 Word.Application,请使用 Globals.ThisAddin.Application。所以,例如:

 Word.Application wdApp = Globals.ThisAddin.Application
 wdApp.Run("AC_Test")

MSDN 文档 material 中的引用:Global access to objects in Office projects and Program VSTO Add-ins

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

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

添加到参考 Microsoft.Vbe.Interop 并使用

using VBIDE = Microsoft.Vbe.Interop;

link 到项目

 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");