C# 在其他工作簿上运行Excel宏

C# 在其他工作簿上运行Excel宏,c#,excel,excel-interop,vba,C#,Excel,Excel Interop,Vba,我正在尝试从一个工作簿在另一个工作簿上运行VBA宏。 我正在使用Microsoft.Office.Interop.Excel(或等效)对象(如果要使用,请向Microsoft Excel 12.0对象库添加引用(COM))编辑和使用C#可执行文件中的Excel文档 例如,documentone中有一些数据。文档2包含用于格式化文档1的宏。文档一每天都是新的,所以我不能在那里存储宏。我正在尝试使用Excel.Application.run()从文档二到文档一运行宏 我使用的示例宏很简单(存储在Mi

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

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

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

我需要在其他工作簿上运行此文件。我可以使用以下代码在同一工作簿上运行它:

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时,宏将不会运行。抛出一个名为NameNotFound的COMException(HRESULT:0x800A03EC)(仅在使用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几乎没有关于我遗漏了什么或者我应该如何处理这个问题的文档()

这里也有类似的问题:
我已经尽了我所能来匹配他们所写的内容(包括添加ReleaseComObject,并在之后设置为null),但没有任何效果。

我已经解决了这个问题

出现问题的原因是试图在其他文档上运行“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;
    }
}
//
///在另一个excel文件上从xlsb文件运行宏
/// 
///要在其上运行宏的excel文件
///保存宏的xlsb文件
///要运行的宏名称(例如Module1.Example)
静态无效测试(字符串ExcelFile、字符串宏文件位置、字符串宏)
{
Application xlApp=新应用程序();//Excel应用程序
工作簿xlWbk=null;
尝试
{
xlWbk=xlApp.Workbooks.Open(ExcelFile);
字符串宏命令=“””+MacroFileLocation+“!”+Macro;
xlApp.Run(宏命令);
}
最后
{
//清理
如果(xlWbk!=null)
尝试
{
xlWbk.Close(真);
}
抓住
{
//无法保存-考虑提醒用户
xlWbk.Close(假);
}
xlApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWbk);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
xlWbk=null;
xlApp=null;
}
}
/// <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;
    }
}