VSTO中Excel添加事件

  • 发布时间:2017年1月19日 10:45
  • 作者:杨仕航
  • 分类标签: VSTO
  • 阅读(12433)
  • 评论(0)

到了VSTO中,开发语言和方式都和Excel vba不同。

VSTO是用C#或VB.net作为开发语言,我使用C#。

那么添加事件也需要按照C#的方式:多播委托。

我们可以给同一个事件绑定多个方法。添加事件有个Bug,后面再说明。


刚开始,我尝试给工作表激活事件绑定激活事件。

实现切换工作表之后,让当前工作表A1单元格写入当前时间。

为了方便测试,我添加一个Ribbon按钮。在其点击事件输入:

Globals.ThisAddIn.Application.ActiveWorkbook.SheetActivate+=

20170119/20170119100409326.png


输入+=之后,会自动提示按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个单元格可否写入当前时间。

20170119/20170119101609570.png


刚开始,测试一切都没问题。

过了一段时间,再切换工作表,就不再写入当前时间,也就是不再执行事件。

反复测试了几次,确认是一个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开头。

上一篇:我的网站搭建(第42天) 添加公告和打赏

下一篇:Python生成pyd文件

相关专题: VSTO的那些坑   

评论列表

智慧如你,不想发表一下意见吗?

新的评论

清空