tags:

views:

315

answers:

1

Hi.

I’m trying to run a excel macro from my C# code, but I'm getting the following error when trying to execute the code.

The code is:

    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);
    }

And the complete error message:

Unhandled Exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. ---> System.Runtime.InteropServices. COMException (0x800A9C68): Exception from HRESULT: 0x800A9C68 --- End of inner exception stack trace --- 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, Bi nder binder, Object target, Object[] providedArgs, ParameterModifier[] modifiers , CultureInfo culture, String[] namedParams) at System.Type.InvokeMember(String name, BindingFlags invokeAttr, Binder bind er, Object target, Object[] args) at scd_afstemning_vhs.Program.RunMacro(Object oApp, Object[] oRunArgs) in C:\ Documents and Settings\lfr\Desktop\sub\scd\scd_afstemning_vhs\scd_afstemning_vhs \Program.cs:line 54 at scd_afstemning_vhs.Program.Main(String[] args) in C:\Documents and Setting s\lfr\Desktop\sub\scd\scd_afstemning_vhs\scd_afstemning_vhs\Program.cs:line 38

Thanks.

A: 

Can't you do oApp.Run(myMacroNameInAStringVariable); instead?
Why are you using reflection?

shahkalpesh