寫在前面
在Excel文檔的自動化處理流程中,有部分值需要通過已定義的宏來求解,所以延伸出了用C# 調用Excel中的宏代碼的需求。
首先要從NuGet中引入Microsoft.Office.Interop.Excel 類庫
?using Excel = Microsoft.Office.Interop.Excel;
代碼實現
/// <summary>/// 執行Excel VBA宏幫助類/// </summary>public class ExcelMacroHelper{/// <summary>/// 執行Excel中的宏/// </summary>/// <param name="excelFilePath">Excel文件路徑</param>/// <param name="macroName">宏名稱</param>/// <param name="parameters">宏參數組</param>/// <param name="rtnValue">宏返回值</param>public void RunExcelMacro(Excel.Application app, string macroName, object[] parameters, out object rtnValue){// 根據參數組是否為空,準備參數組對象object[] paraObjects;if (parameters == null)paraObjects = new object[] { macroName };else{int paraLength = parameters.Length;paraObjects = new object[paraLength + 1];paraObjects[0] = macroName;for (int i = 0; i < paraLength; i++)paraObjects[i + 1] = parameters[i];}rtnValue = this.RunMacro(app, paraObjects);}/// <summary>/// 執行宏/// </summary>/// <param name="oApp">Excel對象</param>/// <param name="oRunArgs">參數(第一個參數為指定宏名稱,后面為指定宏的參數值)</param>/// <returns>宏返回值</returns>private object RunMacro(object app, object[] oRunArgs){object objRtn; // 聲明一個返回對象// 反射方式執行宏objRtn = app.GetType().InvokeMember("Run", System.Reflection.BindingFlags.Default | System.Reflection.BindingFlags.InvokeMethod, null, app, oRunArgs);return objRtn;}}