首页 文章

如何在c#中获得Word VBA函数的结果?

提问于
浏览
1

我需要打开Microsoft Office Word文档并获取该文档中模块功能的结果:

VBA模块(MainModule):

Option Explicit

Public Function GetResult() As String
    GetResult = "My Expected Result"
End Function

我尝试了一些代码,最新的是:[参考]

using System.Reflection;
using System.Runtime.InteropServices;
using MsWord = Microsoft.Office.Interop.Word;
using Microsoft.Office.Core;

...

var wordApp = new MsWord.Application();
wordApp.DisplayAlerts = MsWord.WdAlertLevel.wdAlertsNone;
wordApp.Visible = true;
wordApp.AutomationSecurity = MsoAutomationSecurity.msoAutomationSecurityForceDisable;

MsWord._Document wordDoc = wordApp.Documents.Open(ref fileNameObject,  ref falseValue, ref trueValue, ref falseValue,
    ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue,
    ref missingValue, ref missingValue, ref falseValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue);    

object n;
n = wordApp.Run("GetResult");
// or
n = wordApp.Run("MainModule.GetResult");
// or 
n = RunMacro(wordApp, new Object[] {"MainModule.GetResult"});
// or
n = RunMacro(wordApp, new Object[] {"GetResult"});
// or
n = wordApp.Run("MainModule.GetResult", ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue, ref missingValue);

...

private static object RunMacro(object oApp, object[] oRunArgs)
{
    return oApp.GetType()
        .InvokeMember("Run", BindingFlags.Default | BindingFlags.InvokeMethod, null, oApp, oRunArgs);
}

RunMacro 行的错误是:

调用目标抛出了异常 . [Inner-Exception]:无法运行指定的宏

堆栈跟踪是:

at System.RuntimeType.InvokeDispMethod(String name,BindingFlags invokeAttr,Object target,Object [] args,Boolean [] byrefModifiers,Int32 culture,String [] namedParameters)
at System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Binder binder,Object target,Object [] providedArgs,ParameterModifier [] modifiers,CultureInfo culture,String [] namedParams)
at System.Type.InvokeMember(String name,BindingFlags invokeAttr,Binder binder,Object target,Object [] args)
在ConsoleApplicationTest.Program.RunMacro(Object oApp,Object [] oRunArgs)中c:\ .. \ Visual Studio 2013 \ Projects \ ConsoleApplicationTest \ ConsoleApplicationTest \ Program.cs:第57行
在C:\ .. \ Visual Studio 2013 \ Projects \ ConsoleApplicationTest \ ConsoleApplicationTest \ Program.cs中的ConsoleApplicationTest.Program.Main(String [] args):第32行

注意:
我的Word文档由Office 2013保存为Office 97-2003文档 .
宏设置是启用所有宏 .
还检查了对VBA项目对象模型的信任访问 .

任何帮助将不胜感激 .

1 回答

  • 0

    以下在vb.net中完美运行 . 我相信你可以很容易地将它翻译成C#:

    VB.Net:

    Public Class Form1
        Private Sub Form1_Click(sender As Object, e As EventArgs) Handles Me.Click
            Dim wdApp As New Microsoft.Office.Interop.Word.Application()
            Dim wdDoc As Microsoft.Office.Interop.Word.Document
            wdDoc = wdApp.Documents.Open("C:\SO\Abc.docm")
            Dim s As String = wdApp.Run("myFunc", "Hello World!")
            MsgBox(s)
            wdDoc.Close(False) : wdApp.Quit()
        End Sub
    End Class
    

    VBA Word:

    Function myFunc(str As String) As String
        myFunc = str
    End Function
    

    p.s:VS2015,Word2007,Office12

    编辑令人惊讶的是,当我在我的代码中添加了你添加的安全设置,即 ... = msoAutomationSecurityForceDisable 时,我失败了 . 然后我去了MSDN的页面,发现:

    MsoAutomationSecurityLow打开所有宏,并且是启动程序时的默认值 . MsoAutomationSecurityForceDisable禁用以编程方式打开的所有文件中的所有宏,而不显示任何安全警告 .

    据我了解,它必须是 MsoAutomationSecurityLow . 这个在这里再次起作用 .

相关问题