• Excel打开工作簿事件Appevents_Workbookopeneventhandler

    by{ guangboo }, published {2010-06-09}, Tag { Excel / }

    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插件就会自动重算打开的工作簿