Excel插件编程,当Excel打开文档时候触发某一动作。
金融行业中Excel做各种数据分析时,一般都有Excel模板,模板里面包含了很多的VBA函数,当然这些VBA函数里面有很多是自定义的,是需要与服务器交互,达到获取即时数据的目的,如股票当前价格等。这些函数需要通过计算(与服务器通信)更新模板中的内容,然后保存当前快照,从而得到一个分析数据。
这样的需求一般都需要一个重新计算的按钮,这个按钮的事件就是触发重新计算的,当然Excel中有自动的重算设置,但Excel默认的重算设置在这里是不起作用的,因为只有Excel能够捕获到某些值发生变化时才会启动重算(即使你将重算设置设成了自动重算)。
因为Excel不知道单元格的值有变化,才不会自动重算的,那么我们可以通过将单元格的值设为Dirty,即表示单元格的值发生了变化时,那么Excel就不在拒绝重算了。如:
// 保存原重算设置 Microsoft.Office.Interop.Excel.XlCalculation saveXlCalculation = Globals.ThisAddIn.Application.Calculation; // 设为手动重算 Globals.ThisAddIn.Application.Calculation = Microsoft.Office.Interop.Excel.XlCalculation.xlCalculationManual; // 获取当前活动工作表 Microsoft.Office.Interop.Excel.Worksheet sheet = (Excel.Worksheet)Globals.ThisAddIn.Application.ActiveSheet; // 重算当前工作表 sheet.UsedRange.Dirty(); // 还原重算设置 Globals.ThisAddIn.Application.Calculation = saveXlCalculation;
你也可以通过变了工作簿,来重算所有工作表。
另外你可以通过,下面的代码快速计算:
// 计算所有打开的工作簿 Globals.ThisAddIn.Application.Calculate()
或者:
// 促使对所有打开工作簿中的数据进行完整计算 Globals.ThisAddIn.Application.CalculateFull();
或者:
// 对于所有打开的工作簿,强制数据的完整计算并重建从属关系。 Globals.ThisAddIn.Application.CalculateFullRebuild();
重新计算的工作可以实现了。那么很多研究员还希望在打开Excel模板文件的时候能够自动计算,不需要手动点击重算按钮了。
这是就需要一个WorkbookOpen事件:Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler,该委托需要绑定到Application.WorkbookOpen事件上,如下代码:
private void ThisAddIn_Startup(object sender, System.EventArgs e){ Globals.ThisAddIn.Application.WorkbookOpen += new Microsoft.Office.Interop.Excel.AppEvents_WorkbookOpenEventHandler(FExcelApplication_WorkbookOpen); // 省略其他代码 } void FExcelApplication_WorkbookOpen(Microsoft.Office.Interop.Excel.Workbook Wb) { if((new ConfigClass()).AutoCalcAfterLogih) { // 重新计算Wb } }
这样,当研究员打开模板后Excel插件就会自动重算打开的工作簿