Невозможно выполнить простую обработку событий Excel.Application - PullRequest
0 голосов
/ 28 марта 2019

Я новичок в обработке событий в VSTO. Я сделал обширный онлайн-опрос, в том числе копал документацию Microsoft и пытался применить практичный, но старый пример из центра поддержки.

Проблема этого примера в том, что он не работает на экземпляре Excel.Application, который вызывает ThisAddin. Поэтому я попробовал один из своих:

  • У меня есть приложение Excel 2010 VSTO, созданное в VS 2018.
  • Я добавил новый файл 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 из класса, или это должен быть модуль? Это может быть в Module в Namespace? Связано ли это с Shared WithEvents ThisApp?
  • Что произойдет, если это не Shared Class? Будет ли он обрабатывать Sub столько раз, сколько у меня есть экземпляров этого Class?

Как можно видеть, я немного растерялся ... Я хотел сам провести все эти тесты, но я не в состоянии сделать что-то, что должно быть довольно простым ...!

1 Ответ

0 голосов
/ 28 марта 2019

Для тех, кто может быть заинтересован:

MyEvents.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

ThisAddIn.vb

Public Class ThisAddIn

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

End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...