我正在尝试从我的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行
感谢。
答案 0 :(得分:1)
如果在VBA代码中使用End
语句来终止宏,则会发生此COMException(0x800A9C68)。请改用Exit Function
或Exit 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会产生相同的结果。