关于本站
1、基于Django+Bootstrap开发
2、主要发表本人的技术原创博客
3、本站于 2015-12-01 开始建站
到了VSTO中,开发语言和方式都和Excel vba不同。
VSTO是用C#或VB.net作为开发语言,我使用C#。
那么添加事件也需要按照C#的方式:多播委托。
我们可以给同一个事件绑定多个方法。添加事件有个Bug,后面再说明。
刚开始,我尝试给工作表激活事件绑定激活事件。
实现切换工作表之后,让当前工作表A1单元格写入当前时间。
为了方便测试,我添加一个Ribbon按钮。在其点击事件输入:
Globals.ThisAddIn.Application.ActiveWorkbook.SheetActivate+=
输入+=之后,会自动提示按Tab键自动插入绑定的方法。按Tab之后,还需要再按一次,生成代码。
在该方法写入代码,实现切换工作表,在第1个单元格写入当前时间:
void ActiveWorkbook_SheetActivate(object Sh) { Excel.Worksheet sh = (Excel.Worksheet)Sh; sh.Cells[1, 1].Value = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); }
运行代码,打开工作簿之后,点击刚刚创建的Ribbon按钮绑定当前工作表激活时间。
再来回切换工作表,看看第1个单元格可否写入当前时间。
刚开始,测试一切都没问题。
过了一段时间,再切换工作表,就不再写入当前时间,也就是不再执行事件。
反复测试了几次,确认是一个Bug。坑啊~ ~ ~
不管我是一直切换工作表,还是隔一段时间切换一次,结果都一样会丢失事件。
而且每次失效的时间间隔不同。疑似Excel内部机制会每隔一段时间,自动更新Excel内部对象。
后来在VSTO中的Excel对象Application发现也有SheetActivate方法。
使用这个去绑定事件可以正常使用,没有前面出现的Bug。
而且Application中包含了工作表和工作簿所有事件。额……这个很神奇。
估计微软自己也发现VSTO实现的机制和Excel内部机制有冲突。在Application重新加了一套一样的事件。
建议绑定的事件都在Application中的事件绑定。
我在ThisAddin.cs文件的插件加载事件写测试代码如下:
private void ThisAddIn_Startup(object sender, System.EventArgs e) { Globals.ThisAddIn.Application.SheetActivate += Application_SheetActivate; } void Application_SheetActivate(object Sh) { Excel.Worksheet sh = (Excel.Worksheet)Sh; sh.Cells[1, 1].Value = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"); }
Application中的事件名称和Excel vba中事件名称不太一样,不过也有规律。
若是工作表事件是Sheet开头;若是工作簿事件是Workbook开头;若是窗体事件是Window开头。
相关专题: VSTO的那些坑