2016-02-19 93 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; 
    } 
} 
相關問題