从 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");
我想弄清楚为什么我不能 运行 从用 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");