【问题标题】:word macro called from vsto从 vsto 调用的 word 宏
【发布时间】:2018-11-12 00:44:58
【问题描述】:

我试图弄清楚为什么我无法运行从用 VB 编写的 VSTO 加载项调用的 Microsoft Word 宏。我能找到的每个参考资料都说你可以用单线做到这一点:

Application.Run("MacroName")

宏本身非常简单...它只是切换“键入时替换文本”设置(AutoCorrect.ReplaceText = Not 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

单击按钮不会更改替换文本设置的状态。我在插件开发方面有点缺乏经验,所以感谢任何建议。

谢谢

【问题讨论】:

  • 更改替换文本的代码在哪里?您是否尝试调试代码?
  • 好吧,我试图将用于替换文本的代码保留在加载项中,而不是调用宏。但是,出于某种原因,即使 Word 应用程序对象可用,如果我尝试使用它来更改 AutoCorrect.ReplaceText 的状态,它也不会更改设置。我能够以编程方式更改它的唯一方法是在宏中。

标签: vba vsto ms-word


【解决方案1】:

在 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 projectsProgram VSTO Add-ins

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

【讨论】:

  • 谢谢,这帮助我找到了解决方案。事实上,我什至不必调用宏来进行更改以替换文本,这更好。
  • @rimetree 同意,这样会更好 :-) 但无论如何,这是一个很好的问答对,因为人们经常对你提出的问题感到困惑!
【解决方案2】:

确保在默认 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 子程序应声明为公共的。

请参阅Application.Run 了解更多信息。

【讨论】:

    【解决方案3】:

    也许有人会发现在 ms 项目 (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");
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 2020-07-29
      • 2010-09-21
      • 2015-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多