0

我是 VSTO 上的事件处理新手。我在网上进行了广泛的研究,包括挖掘 Microsoft 文档并尝试从支持中心应用一个实用但旧的示例。

此示例的问题在于它不适Excel.Application用于调用ThisAddin. 所以我尝试了自己的一个:

  • 我有一个 Excel 2010 应用程序范围的 VSTO,通过 VS 2017 创建。
  • 我添加了一个新文件MyEvents.vb,其中包含以下内容:

.

Imports Microsoft.Office.Interop.Excel

Module MyEvents

    WithEvents ThisApp As Excel.Application '= Globals.ThisAddIn.Application

    Private Sub ThisApp_SheetBeforeDoubleClick(Sh As Object, Target As Range, ByRef Cancel As Boolean) Handles ThisApp.SheetBeforeDoubleClick
        Dim FromSheet As Excel.Worksheet = Sh
        System.Diagnostics.Debug.Print("Event triggered: ThisApp_SheetBeforeDoubleClick in {0} or {1}", FromSheet, Target.Worksheet.Name)
    End Sub

    Private Sub ThisApp_WorkbookActivate(Wb As Workbook) Handles ThisApp.WorkbookActivate
        System.Diagnostics.Debug.Print("Event triggered: ThisApp_WorkbookActivate")
    End Sub

End Module

当我编译时,打开一个新工作簿并尝试双击或激活另一个工作簿:没有任何反应。我一定遗漏了一些明显的东西。我觉得我缺乏一些关于通过 VSTO 处理事件的基础知识,我很高兴有人建议对此事进行一些额外的阅读。

例如:

  • 我需要WithEvents ThisApp As Excel.Application = Globals.ThisAddIn.Application还是只是WithEvents ThisApp As Excel.Application?即,我可以将事件绑定到给定对象(应用程序、工作表等),还是需要在Sub触发事件后检查调用者,为什么?
  • 是否可以从一个类处理 VSTO 事件,还是必须是一个模块?可以在 aModuleNamespace吗?是否/可以链接到一个Shared WithEvents ThisApp
  • 如果它不是 a 会发生什么Shared ClassSub它会像我目前有这样的实例一样多次运行我的处理Class吗?

正如人们所看到的,我在这里有点迷失了..我想自己运行所有这些测试,但我无法做一些应该非常基本的事情..!

4

1 回答 1

1

对于任何可能感兴趣的人:

我的事件.vb

Imports Microsoft.Office.Interop.Excel

Module MyEvents

    WithEvents ThisApp As Excel.Application

    'Start listening to Events thrown by ExcelApp
    Sub StartEvents(ExcelApp as Excel.Application)
        ThisApp = ExcelApp 
    End Sub

    Private Sub ThisApp_SheetBeforeDoubleClick(Sh As Object, Target As Range, ByRef Cancel As Boolean) Handles ThisApp.SheetBeforeDoubleClick
        Dim FromSheet As Excel.Worksheet = Sh
        System.Diagnostics.Debug.Print("Event triggered: ThisApp_SheetBeforeDoubleClick in {0} or {1}", FromSheet, Target.Worksheet.Name)
    End Sub

    Private Sub ThisApp_WorkbookActivate(Wb As Workbook) Handles ThisApp.WorkbookActivate
        System.Diagnostics.Debug.Print("Event triggered: ThisApp_WorkbookActivate")
    End Sub

End Module

这个插件.vb

Public Class ThisAddIn

    Private Sub ThisAddIn_Startup() Handles Me.Startup
        MyEvents.StartEvents(Globals.ThisAddIn.Application)
    End Sub

End Class
于 2019-03-28T17:39:55.080 回答