Прямо сейчас весь мой код VBA находится в ThisOutlookSession. Я хочу поместить все в модуль, чтобы я мог его экспортировать, а другие люди могли импортировать его, не возясь со своим собственным ThisOutlookSession. Я хочу, чтобы пользователю было легко - пользователь просто импортирует мой файл модуля.
Мой код зависит от Application_MAPILogonComplete и WithEvents. Ни один из них не доступен / не работает в модуле.
Я вижу, что у классов есть Class_Initialize, но он срабатывает только при инициализации объекта класса, поэтому мне все равно понадобится какое-то событие Application_MAPILogonComplete.
Есть ли способ делать то, что я хочу? Хранить все в модуле или классе, который можно экспортировать и импортировать, который запускает код при открытии Outlook и поддерживает WithEvents, чтобы я мог выполнять функцию при добавлении новых сообщений электронной почты в папку?
@TimWilliams Спасибо, но я знаю эту информацию.





Только объект может обрабатывать события, поэтому вам нужен класс - 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 у вас всегда может быть автоматически созданный объект в стандартном модуле, например. Private AppEvents As New Class1 - но я бы больше доверял использованию ThisOutlookSession в качестве точки входа, работает отлично и надежно. Автоматически созданные объекты (As New) всегда выглядят странно.
Когда я добавляю 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не.
Да уж, As New странный. Объявления не являются исполняемыми, поэтому объект фактически создается только тогда, когда на идентификатор ссылается первый исполняемый оператор, который до него доходит.