Как контролировать, когда заканчивается класс VBA - PullRequest
0 голосов
/ 12 мая 2018

Я написал модуль класса VBA для создания почтового элемента Outlook из моей книги Excel и отслеживания события MailItem_Send для запуска макроса в моей рабочей книге после отправки почтового элемента.

Модуль класса выглядит следующим образом:

Option Explicit

Public MailSubject As String
Public MailRecipient As String
Public MailBody As String

Public WithEvents mOutlook As Outlook.Application
Public WithEvents mMailItem As Outlook.MailItem

Private Sub Class_Initialize()
    Set mOutlook = New Outlook.Application
    MsgBox "mMailItem Class-object has been initialized"
End Sub

Public Sub CreateAndDisplayMailItem()

    Set mMailItem = Outlook.CreateItem(olMailItem)
    With mMailItem
        .To = MailRecipient
        .Subject = MailSubject
        .Body = MailBody
        .Display
    End With

End Sub

Private Sub Class_Terminate()
    Set mMailItem = Nothing
    MsgBox "mMailItem Class-object has ben terminated"
End Sub

Private Sub mOutlook_ItemSend(ByVal Item As Object, Cancel As Boolean)
    MsgBox "mOutlook Item Send Event has ben triggered"
    'Call MyMacro
End Sub
  • После того, как я создаю почтовый элемент Outlook из моей книги Excel, используя вышеописанный Class-модуль, окно Outlook Send-A-Mail открывается правильно.

  • Если я останусь в окне Send-A-Mail (не переходя ни в какое другое окно), пока не будет отправлено письмо;мое событие ItemSend срабатывает правильно.

Проблема заключается в следующем:

  • Если я возвращаюсь в свою книгу Excel (поэтому я изменяю окно из моего отображенного элемента MailItem обратнов мою рабочую книгу), объект класса завершается перед отправкой моего MailItem.

Событие Class_Terminate от моего MailItem должно сработать после отправки MailItem!Не раньше, чем.

Класс используется здесь:

Sub Mail_Test()

Dim myMailItem As clsMailItem

Set myMailItem = New clsMailItem
myMailItem.MailSubject = "Test überschrift"
myMailItem.MailBody = "Test Body"
myMailItem.MailRecipient = "xyz@test.de"

myMailItem.CreateAndDisplayMailItem

End Sub

1 Ответ

0 голосов
/ 12 мая 2018

Это работает для меня, если я назову ваш класс ol

Option Explicit

Dim xOl As New ol

Sub test()

    xOl.MailRecipient = "xyz@abc.com"
    xOl.MailBody = "Test"
    xOl.MailSubject = "Subject"
    xOl.CreateAndDisplayMailItem

End Sub

Если вы объявите xOl в подпрограмме, он будет завершен с окончанием подпрограммы.

...