Редактировать открытую электронную почту из Excel - PullRequest
0 голосов
/ 01 октября 2018

Редактировать: Спасибо всем.Все предложения, вероятно, работают.Я только что, наконец, понял, что мой работодатель включил опцию безопасности, чтобы предотвратить подобные действия.К сожалению, я не могу редактировать электронные письма, только создавать их.

Я пытаюсь выяснить, как изменить открытое электронное письмо из Excel.

У меня есть шаблон электронной почты, который заменит Excelнекоторые строки со значениями из рабочего листа в моей книге.

Я исследовал activeinspector , но я все еще не уверен, как кросс-программирование работает между excel и outlook.Поиск по различным сайтам дает мне это, но это не работает.

Ошибка 287 на str = outlookMail.Body

' Create the outlook object
Dim outlookApp As Outlook.Application
Set outlookApp = New Outlook.Application

Dim outlookInspector As Outlook.Inspector
Dim outlookMail As Outlook.MailItem

Set outlookInspector = outlookApp.ActiveInspector

Dim str As String

If Not outlookInspector Is Nothing Then
    If TypeOf outlookInspector.CurrentItem Is Outlook.MailItem Then
        Set outlookMail = outlookInspector.CurrentItem
        str = outlookMail.Body

        ' Replacements
        str = Replace(str, "DIPOC", "string1")
        str = Replace(str, "REFNUM", "string2")
        str = Replace(str, "RCVDATE", "string3")
        str = Replace(str, "EMPNAME", "string4")
        str = Replace(str, "EMPEIDN", "string5")
        str = Replace(str, "ACTIONREQ", "string6")

        outlookMail.Body = str
    End If
End If

Я все еще новичок в этом, так что любойпомощь будет оценена.Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

это хорошо работает с моей стороны.Это меняет мою электронную почту на простой текстовый формат.

Вот моя тестовая среда: Office 2016 + windows 10 и ниже - это код, который я тестировал.

Sub strat()
' Create the outlook object
Dim outlookApp As Outlook.Application
Set outlookApp = New Outlook.Application
Dim outlookInspector As Outlook.Inspector
Dim outlookMail As Outlook.MailItem
Set outlookInspector = outlookApp.ActiveInspector
Dim str As String
If Not outlookInspector Is Nothing Then
    If TypeOf outlookInspector.CurrentItem Is Outlook.MailItem Then
        Set outlookMail = outlookInspector.CurrentItem
        str = outlookMail.Body

        ' Replacements
        str = Replace(str, "For", "string1")
        str = Replace(str, "REFNUM", "string2")
        str = Replace(str, "RCVDATE", "string3")
        str = Replace(str, "EMPNAME", "string4")
        str = Replace(str, "EMPEIDN", "string5")
        str = Replace(str, "ACTIONREQ", "string6")
        outlookMail.Body = str
        MsgBox str
    End If
End If
End Sub

С наилучшими пожеланиями,

Эван

0 голосов
/ 01 октября 2018

Это не удастся, если не будет открыто активное электронное письмо (здесь нет кода обработки ошибок), но только для целей тестирования оно работало для меня.Я предполагаю, что dipoc, RefNum, rcvdate - это переменные, которые вы определили в другом месте (я проверял это со статическими строками).Также имя объекта Outlook - «Outlook», поэтому было бы лучше избегать именования объекта «Outlook».Если у вас есть форматирование HTML в электронном письме (как в подписи), вы хотите использовать .HTMLBody вместо .Body

Sub test()
    ' Create the outlook object
    Dim olApp As Object
    Set olApp = CreateObject("Outlook.Application")

    Dim olInspector As Object
    Dim olOutMail As Object
    Set olInspector = olApp.ActiveInspector
    Set olOutMail = olInspector.CurrentItem

    Dim str As String
    str = olOutMail.Body

    ' Replacements
    str = Replace(str, "DIPOC", dipoc)
    str = Replace(str, "REFNUM", RefNum)
    str = Replace(str, "RCVDATE", rcvdate)

    olOutMail.Body = str

    ' Remove the outlook objects
    Set olInspector = Nothing
    Set olOutMail = Nothing
    Set olApp = Nothing
End Sub
0 голосов
/ 01 октября 2018
Dim Outlook As Object
Set Outlook = CreateObject("Outlook.Application")

Dim oInspector As Inspector
Dim olOutMail As MailItem

Если ваш код компилируется, то у вас есть ссылка на объектную модель Outlook, а идентификатор Outlook ссылается на библиотеку типов Outlook: Dim Outlook As Object равно отслеживание этой декларации.Переименуйте его и явно квалифицируйте типы с помощью библиотеки, из которой они:

Dim outlookApp As Outlook.Application
Set outlookApp = New Outlook.Application

Dim outlookInspector As Outlook.Inspector
Dim outlookMail As Outlook.MailItem

Я не смог выяснить согласованную схему для вашего префикса, поэтому я отбросил ее.

Теперькогда вы назначаете ссылку для инспектора:

Set oInspector = Outlook.ActiveInspector

Это неоднозначно, по крайней мере для читателя-человека: если вы набираете IntelliSense при вводе этой . точкитогда VBA понимает Outlook как Outlook.Application, и это означает проблему, поскольку теперь у вас есть неявная Application ссылка , которая не является примером, с которым вы хотите работать ... и который можеточень хорошо, почему вы получаете эту ошибку.

Вы хотите устранить неоднозначность.

Set outlookInspector = outlookApp.ActiveInspector

Это должно дать вам ссылку Inspector, с которой вы собираетесь работать.

Следующая проблема заключается в том, что вы устанавливаете olOutMail ссылку на объект при условии, что есть активный инспектор, и что вы смотрите на MailItem - ожидайте возгорания, если любое из предположений не соответствует действительности.

If Not outlookInspector Is Nothing Then
    If TypeOf outlookInspector.CurrentItem Is Outlook.MailItem Then
        'NOW we KNOW we're looking at a mailitem.
        Set outlookMail = outlookInspector.CurrentItem
        '...work with outlookMail here...
    End If
End If
0 голосов
/ 01 октября 2018

Вы инициализируете переменную olOutMail перед инициализацией переменной oInspector.Переключите их:

Set oInspector = Outlook.ActiveInspector
Set olOutMail = oInspector.CurrentItem
...