I am trying to run Excel macro and close excel after run.
Unfortunately it does not work. I tried all solutions from Stackoverflow and could not get reliable solution. Please help.
As you can see I am trying to close, quite, release COM object but nothing seems to be working.
public static bool RunMacro(string Path, string MacroName, bool Close, ProgressForm ProgressForm, params object[] Arguments)
{
Microsoft.Office.Interop.Excel.Application aApplication = null;
bool aCloseApplication = true;
bool aResult = false;
try
{
aApplication = (Microsoft.Office.Interop.Excel.Application)Marshal.GetActiveObject("Excel.Application");
aCloseApplication = false;
}
catch (COMException aCOMException)
{
aApplication = new Microsoft.Office.Interop.Excel.Application();
aApplication.Visible = false;
}
if (aApplication != null)
{
aApplication.ScreenUpdating = false;
Microsoft.Office.Interop.Excel.Workbook aWorkbook = null;
Microsoft.Office.Interop.Excel.Worksheet aWorksheet = null;
bool aCloseWorkbook = true;
try
{
if (IsEdited(aApplication))
{
throw new Exception("Excel is in cell edit mode. Please stop editing cell and run import again");
}
else
{
for (int i = 0; i < aApplication.Workbooks.Count; i++)
if (aApplication.Workbooks[i + 1].FullName == Path)
{
aWorkbook = aApplication.Workbooks[i + 1];
aCloseWorkbook = false;
break;
}
if (aWorkbook == null)
aWorkbook = aApplication.Workbooks.Open(Path);
// Run macro here
aApplication.Run(string.Format("{0}!{1}", System.IO.Path.GetFileName(Path), MacroName), Arguments);
aResult = true;
}
}
finally
{
if (aWorksheet != null)
{
Marshal.ReleaseComObject(aWorksheet);
}
//does not work here!!! I want to close excel here
if (aWorkbook != null)
aWorkbook.Close();
aApplication.Quit();
Marshal.ReleaseComObject(aWorkbook);
Marshal.ReleaseComObject(aApplication);
}
}
return aResult;
}