Используйте Application_MAPILogonComplete и WithEvents в модуле вместо ThisOutlookSession в Outlook VBA

Прямо сейчас весь мой код VBA находится в ThisOutlookSession. Я хочу поместить все в модуль, чтобы я мог его экспортировать, а другие люди могли импортировать его, не возясь со своим собственным ThisOutlookSession. Я хочу, чтобы пользователю было легко - пользователь просто импортирует мой файл модуля.

Мой код зависит от Application_MAPILogonComplete и WithEvents. Ни один из них не доступен / не работает в модуле.

Я вижу, что у классов есть Class_Initialize, но он срабатывает только при инициализации объекта класса, поэтому мне все равно понадобится какое-то событие Application_MAPILogonComplete.

Есть ли способ делать то, что я хочу? Хранить все в модуле или классе, который можно экспортировать и импортировать, который запускает код при открытии Outlook и поддерживает WithEvents, чтобы я мог выполнять функцию при добавлении новых сообщений электронной почты в папку?

outlookcode.com/article.aspx?id=28
Tim Williams 10.08.2018 18:38

@TimWilliams Спасибо, но я знаю эту информацию.

IMTheNachoMan 10.08.2018 21:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
145
1

Ответы 1

Только объект может обрабатывать события, поэтому вам нужен класс - ThisOutlookSession - один из них, но если вы хотите модулировать свой код, вам понадобится модуль класса для этой работы.

Option Explicit
Private WithEvents App As Outlook.Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub Class_Terminate()
    Set App = Nothing
End Sub

'select "App" from the left-hand dropdown at the top of the code pane.
'then select the event(s) you want to handle from the right-hand dropdown;
'the VBE will automatically generate the handler(s) with the correct signature.

Все, что осталось сделать, это иметь реальный экземпляр этого класса (скажем, он называется Class1) - вы захотите создать этот экземпляр в ThisOutlookSession.

Option Explicit
Private AppEvents As Class1

Private Sub Application_Quit()
    Set AppEvents = Nothing
End Sub

Private Sub Application_Startup()
    Set AppEvents = New Class1
End Sub

Нет возможности сделать это без редактирования / модификации ThisOutlookSession?

IMTheNachoMan 10.08.2018 21:17

@IMTheNachoMan у вас всегда может быть автоматически созданный объект в стандартном модуле, например. Private AppEvents As New Class1 - но я бы больше доверял использованию ThisOutlookSession в качестве точки входа, работает отлично и надежно. Автоматически созданные объекты (As New) всегда выглядят странно.

Mathieu Guindon 10.08.2018 21:19

Когда я добавляю Dim AppEvents As Class1, затем Set A = New Class1 к public sub в модуле и запускаю его, функция Class_Initializeделает fire. Когда я пробую Dim AppEvents As New Class1 в public sub или Private AppEvents As New Class1 в верхней части модуля, срабатывает функция Class_Initializeне.

IMTheNachoMan 10.08.2018 21:28

Да уж, As New странный. Объявления не являются исполняемыми, поэтому объект фактически создается только тогда, когда на идентификатор ссылается первый исполняемый оператор, который до него доходит.

Mathieu Guindon 10.08.2018 21:59

Другие вопросы по теме