在其他工作簿上运行Excelmacros

我正试图从另一个工作簿上的一个工作簿运行VBAmacros。
我正在使用Microsoft.Office.Interop.Excel(或等价物)对象(如果要使用它,请将引用(COM)添加到Microsoft Excel 12.0对象库)以编辑和使用C#可执行文件中的Excel文档。

例如,文档1中有一些数据。 文档2包含用于格式化文档1的macros。 文件一是每天新的,所以我不能在那里存储macros。 我试图使用Excel.Application.Run()在文档1上的文档2中运行macros。

我使用的示例macros很简单(存储在Microsoft Excel对象:ThisWorkbook中):

Sub Test() Sheets("Sheet1").Select Range("A1").Value = 32 End Sub 

我需要这个在不同的工作簿上运行。 我可以使用以下代码在相同的工作簿上运行它:

 Application xlApp = new Application(); //Excel app Workbook xlWbk = null; try { xlWbk = xlApp.Workbooks.Open(DocumentTwoLocation); xlApp.Run("'" + DocumentTwoLocation + "'!" + MacroName); //MacroName example: ThisWorkbook.Test } finally { if (xlWbk != null) try { xlWbk.Close(true); //Saves changes } catch { xlWbk.Close(false); } xlApp.Quit(); } 

当我将xlApp.Workbooks.Open中的DocumentTwoLocation更改为DocumentOneLocation时,macros将不会运行。 抛出一个COMException(HRESULT:0x800A03EC),它是NameNotFound(仅在使用xlApp.Run()时引发)。 文件地址是正确的。 即使我事先打开这两个文件:

 Application xlApp = new Application(); //Excel app Workbook xlWbk = null; Workbook xlMacroBook = null; try { xlWbk = xlApp.Workbooks.Open(DocumentOneLocation); xlMacroBook = xlApp.Workbooks.Open(DocumentTwoLocation); xlApp.Run("'" + DocumentTwoLocation + "'!" + MacroName); //MacroName example: ThisWorkbook.Test } finally { if (xlWbk != null) try { xlWbk.Close(true); //Saves changes } catch { xlWbk.Close(false); } if (xlMacroBook != null) xlMacroBook.Close(false) //Don't save changes xlApp.Quit(); } 

仍然发生错误(相同的0x800A03ECexception)。

MSDN几乎没有什么文件丢失或我应该如何处理这个( https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.applicationclass.run.aspx )

在这里有类似的问题: 从C#调用Excelmacros时出错 ,我已经尽了一切努力来匹配他们写的东西(包括添加ReleaseComObject,并将其设置为null),但无济于事。

我已经解决了这个问题。

发生的问题是由于尝试在另一个文档上运行“xlsm”格式的macros而导致的。 在另一个工作簿上运行macros只能用Microsoft Office Excel二进制工作表(xlsb格式)。 如果你面临同样的问题 – 使用xlsb来保存macros,而不是xlsm。

对于你感兴趣的人,最后的代码如下:

 /// <summary> /// Run a macro from an xlsb file on another excel file /// </summary> /// <param name="ExcelFile">The excel file to run the macro on</param> /// <param name="MacroFileLocation">The xlsb file the macro is saved in</m> /// <param name="Macro">The macro name to run (eg Module1.Example)</param> static void Test(string ExcelFile, string MacroFileLocation, string Macro) { Application xlApp = new Application(); //Excel app Workbook xlWbk = null; try { xlWbk = xlApp.Workbooks.Open(ExcelFile); string MacroCommand = "'" + MacroFileLocation + "'!" + Macro; xlApp.Run(MacroCommand); } finally { //Clean up if (xlWbk != null) try { xlWbk.Close(true); } catch { //Couldn't save - consider alerting user xlWbk.Close(false); } xlApp.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWbk); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); xlWbk = null; xlApp = null; } }