我知道将代码插入 VBA 项目的唯一方法是Office.Interop.Excel
与Microsoft.Vbe.Interop
(不确定 ClosedXML 和其他第 3 方......但仍然想分享)一起使用
但是,既然您要寻求替代方案,这就是我的工作方式;
Creating a workbook and inserting a macro to it using C#
您需要允许以编程方式访问Excel 中的 VBA 项目。
- (Excel) 文件 -> 选项 -> 信任中心 -> 信任中心设置 -> 宏设置 -> 信任对 VBA 项目对象模型的访问
在您的 C# 解决方案中,将 COM 引用添加到
将 using 指令添加到您的 C# 代码隐藏文件
using Microsoft.Office.Interop.Excel;
using System.Reflection;
using Microsoft.Vbe.Interop;
using System.Runtime.InteropServices;
现在按照代码和注释
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
xlApp.Visible = true;
Workbook wb = xlApp.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
VBProject vbProj = wb.VBProject; // access to VBAProject
VBComponent vbComp = vbProj.VBComponents.Add(vbext_ComponentType.vbext_ct_StdModule); // adding a standard coding module
vbComp.CodeModule.DeleteLines(1, vbComp.CodeModule.CountOfLines); //emptying it
// this is VBA code to add to the coding module
string code = "Public Sub HelloWorld() \n" +
" MsgBox \"hello world!\" \n" +
"End Sub";
// code should be added to the module now
vbComp.CodeModule.AddFromString(code);
// location to which you want to save the workbook - desktop in this case
string fullPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + "\\macroWorkbook.xlsm";
// run the macro
xlApp.Run("HelloWorld");
// save as macro enabled workbook
wb.SaveAs(Filename: fullPath, FileFormat: XlFileFormat.xlOpenXMLWorkbookMacroEnabled);
xlApp.Quit();
在上面的代码中;
您创建一个主机 Excel 应用程序,添加一个工作簿。访问 VBA 项目对象模块,将新的标准编码模块添加到 VBA 项目,将 VBA 宏写入该模块。Application.Run("HelloWorld")
只需调用宏 - 请注意,如果您不希望该框弹出,则可以注释掉此部分。然后最后将工作簿作为启用宏fullPath
的工作簿保存到变量中指定的位置。
PS。请注意,我没有添加任何错误处理。
有关 C# 和 VBA 的其他提示,请参阅此博客
希望这会有所帮助 :)