Функция триггера для запуска, когда пользователь начинает писать новое электронное письмо в Outlook — VBA

Я хочу запускать функцию VBA всякий раз, когда кто-то создает новое электронное письмо в Outlook. Это может произойти либо потому, что они нажимают кнопку «Новая почта», либо потому, что сторонняя программа создает новое почтовое окно.

Я пытался использовать Application_ItemLoad() и проверять объект Item, который передается в качестве аргумента события, однако в 2007 году я получаю сообщение, в котором говорится: «Свойства и методы элемента не могут использоваться внутри этой процедуры обработки события». По-видимому, это известная проблема в Outlook 2007.

У кого-нибудь есть надежный метод для этого?

Спасибо,

Стив


person Steve Gore    schedule 24.10.2012    source источник
comment
См. пример события NewInspector здесь stackoverflow.com/questions/3674832/   -  person niton    schedule 27.10.2013


Ответы (2)


В Outlook 2010 у меня это сработало, и я не нашел отчетов об ошибках. Какой у вас точный код? Что вы имеете в виду под «проверить объект элемента»?

Вы просто помещаете свой код в событие следующим образом:

Private Sub Application_ItemLoad(ByVal Item As Object)
    MsgBox "New mail item."
End Sub

Это все.

Я надеюсь, что эти замечания, предоставленные MS, будут вам полезны: http://msdn.microsoft.com/en-us/library/office/ff868544.aspx

Примечания:

Это событие происходит, когда элемент Outlook начинает загружаться в память. Данные для элемента еще недоступны, кроме значений свойств Class и MessageClass элемента Outlook, поэтому возникает ошибка при вызове любого свойства, отличного от Class или MessageClass, для элемента Outlook, возвращаемого в Item. Точно так же ошибка возникает при попытке вызвать любой метод из элемента Outlook или при вызове метода GetObjectReference объекта Application для элемента Outlook, возвращенного в Item.

Изменить:
Лучшее, что я смог придумать, это поместить этот код в метод события Application_ItemSend:

Private Sub Application_ItemSend(ByVal Item As Object, Cancel As Boolean)

Dim myInspector
Dim wdDoc
Dim rng

Set myInspector = Item.GetInspector
Set wdDoc = myInspector.WordEditor

Set rng = wdDoc.Application.Selection

With rng
    With rng.Style.Font
        .Name = "Arial Black"
        .Size = 12
    End With
End With

Set myInspector = Nothing
Set wdDoc = Nothing

End Sub

Проблема в том, что вы не можете установить свойства элемента, который еще не доступен (как описано в MS). Ну, с этой точки зрения это на самом деле невозможно.

person html_programmer    schedule 24.10.2012
comment
У меня есть стороннее приложение, которое запускает новое электронное письмо (например, открывает окно для создания электронного письма). Однако он делает это шрифтом, который не нравится моей фирме. Они хотят, чтобы я сделал так, чтобы при открытии окна электронной почты шрифт автоматически менялся на Calibri. - person Steve Gore; 24.10.2012
comment
Да, это стена, о которую я тоже продолжаю биться. Спасибо за подтверждение. - person Steve Gore; 26.10.2012

Я придумал способ сделать это для ответов. Однако я еще не понял, как это сделать для новых композиций.

Public WithEvents myExplorer As Outlook.Explorer 'Gives us the ability to trigger off explorer events
Public WithEvents myMailItem As Outlook.MailItem 'Gives us the ability to trigger off MailItem events

Private Sub Application_Startup()   
    Set myExplorer = Application.ActiveExplorer 'Initialize
End Sub

Private Sub myExplorer_SelectionChange()
    If (myExplorer.Selection.Count > 0) Then
        If (myExplorer.Selection.Item(1).Class = olMail) Then
            Set myMailItem = myExplorer.Selection.Item(1) 'Initialize
        End If
    End If
End Sub


Public Sub NewHTMLEmail(htmlToUse As String, Addressee As String, SubjectLine As String)
    Dim NewEmail As Outlook.MailItem
    Set NewEmail = Application.CreateItem(olMailItem)
    NewEmail.BodyFormat = olFormatHTML
    NewEmail.Subject = SubjectLine
    NewEmail.To = Addressee
    NewEmail.HTMLBody = htmlToUse
    NewEmail.Display
End Sub

'This trigger executes when we hit the "Reply" button while viewing a mail item
Private Sub myMailItem_Reply(ByVal Response As Object, Cancel As Boolean)
    Dim htmlString As String, thisMailItem As Outlook.MailItem, MissingText As String
    Set thisMailItem = Response
    Call NewHTMLEmail(thisMailItem.HTMLBody, thisMailItem.To, thisMailItem.Subject)

    Response.Close olDiscard
    thisMailItem.Delete    
End Sub
person Nate Decker    schedule 11.10.2013