从C#运行excel宏时出现System.Reflection.TargetInvocationException

时间:2010-03-17 09:30:39

标签: c# excel

我正在尝试从我的C#代码运行excel宏,但是在尝试执行代码时遇到以下错误。

代码是:

    static void Main(string[] args)
    {
            object oMissing = System.Reflection.Missing.Value;

            Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
            oExcel.Visible = true;


            Excel.Workbooks oBooks = oExcel.Workbooks;
            Excel._Workbook oBook = null;
            oBook = oBooks.Open(@"c:\Afstemning_BEC_SCD_PROD.xls", oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);

            // Run the macros.'
            RunMacro(oExcel, new Object[] { "macro_name" });


            // Quit Excel and clean up.
            oBook.Close(false, oMissing, oMissing);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBook);
            oBook = null;
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oBooks);
            oBooks = null;
            oExcel.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(oExcel);
            oExcel = null;
    }

    public static void RunMacro(object oApp, object[] oRunArgs)
    {
        oApp.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, oApp, oRunArgs);
    }

完整的错误消息:

未处理的异常:System.Reflection.TargetInvocationException:异常有 被调用的目标抛出。 ---> System.Runtime.InteropServices。 COMException(0x800A9C68):来自HRESULT的异常:0x800A9C68    ---内部异常堆栈跟踪结束---    在System.RuntimeType.InvokeDispMethod(String name,BindingFlags invokeAttr, Object target,Object [] args,Boolean [] byrefModifiers,Int32 culture,String [] namedParameters)    在System.RuntimeType.InvokeMember(String name,BindingFlags bindingFlags,Bi nder binder,Object target,Object [] providedArgs,ParameterModifier []修饰符 ,CultureInfo culture,String [] namedParams)    在System.Type.InvokeMember(String name,BindingFlags invokeAttr,Binder bind 呃,对象目标,对象[] args)    at scd_afstemning_vhs.Program.RunMacro(Object oApp,Object [] oRunArgs)在C:\ 文档和设置\ lfr \ Desktop \ sub \ scd \ scd_afstemning_vhs \ scd_afstemning_vhs \ Program.cs:第54行    在C:\ Documents and Setting中的scd_afstemning_vhs.Program.Main(String [] args) s \ lfr \ Desktop \ sub \ scd \ scd_afstemning_vhs \ scd_afstemning_vhs \ Program.cs:第38行

感谢。

3 个答案:

答案 0 :(得分:1)

如果在VBA代码中使用End语句来终止宏,则会发生此COMException(0x800A9C68)。请改用Exit FunctionExit Sub

Quote from MSDN forum: End有点过于突兀,并没有真正清理过正确的事情

答案 1 :(得分:0)

你不能代替oApp.Run(myMacroNameInAStringVariable);吗? 你为什么用反射?

答案 2 :(得分:0)

我怀疑这里的问题是Excel安装(请参阅我对该问题的评论)。我们的应用程序中运行的代码使用相同的调用调用Excel宏,如问题中所示。此方法也记录在案here

我的用户的计算机正在运行Office 2007 RTM。我尝试在Office上执行修复。修复已完成,但运行代码时仍然存在错误。然后,我应用了Office 2007 Service Pack 2,问题就消失了。我不相信这种行为与SP2中包含的修复有任何关系,但只是Service Pack安装程序采取的操作将损坏的Excel修复为副作用。据推测,简单的卸载和完全重新安装Office 2007 RTM会产生相同的结果。