C# 在其他工作簿上运行Excel宏
我正在尝试从一个工作簿在另一个工作簿上运行VBA宏。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
我正在使用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;
}
}