2016-02-19 113 views
2

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

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

我使用的示例宏很简单(存储在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到DocumentOneLocation DocumentTwoLocation,宏将不会运行。抛出一个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(); 
} 

仍然出现错误(同样0x800A03EC除外)。

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

事情已经在这里问: Error when calling Excel macro from C# ,我已经做了所有我可以匹配他们有什么写(包括添加ReleaseComObject,并设置为null后),但无济于事。

回答

1

我已经解决了这个问题。

该问题发生的原因是尝试在其他文档上运行“xlsm”格式的宏。使用Microsoft Office Excel二进制工作表(xlsb格式)只能在其他工作簿上运行宏。如果你面临同样的问题 - 使用xlsb来保存宏,而不是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 (e.g. 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; 
    } 
} 
相关问题