MailItem.GetInspector.WordEditor в Office 2016 генерирует ошибку, определяемую приложением или объектом

Я написал макрос Excel для отправки электронной почты из электронной таблицы. Он работает в Office 2013, но не в Office 2016.

Я посмотрел на различия VBA между Office 2013 и 2016, но ничего не увидел об изменениях в инспекторе или редакторе слов для объектов сообщений.

Как только он достигает .GetInspector.WordEditor, он выдает:

Ошибка времени выполнения "287":
Ошибка, определяемая приложением или объектом

Вот соответствующая часть макроса:

Sub SendEmail()
    Dim actSheet As Worksheet
    Set actSheet = ActiveSheet

    'directories of attachment and email template
    Dim dirEmail as String, dirAttach As String

    ' Directory of email template as word document
    dirEmail = _
        "Path_To_Word_Doc_Email_Body"

    ' Directories of attachments
    dirAttach = _
        "Path_To_Attachment"

    ' Email Subject line
    Dim subjEmail As String
    subjEmail = "Email Subject"

    Dim wordApp As Word.Application
    Dim docEmail As Word.Document

    ' Opens email template and copies it
    Set wordApp = New Word.Application
    Set docEmail = wordApp.Documents.Open(dirEmail, ReadOnly:=True)
    docEmail.Content.Copy

    Dim OutApp As Outlook.Application
    Set OutApp = New Outlook.Application
    Dim OutMail As MailItem
    Dim outEdit As Word.Document

    ' The names/emails to send to
    Dim docName As String, sendEmail As String, ccEmail As String, siteName As String
    Dim corName As String

    Dim row As Integer
    For row = 2 To 20

        sendName = actSheet.Cells(row, 1)
        sendEmail = actSheet.Cells(row, 2)
        ccEmail = actSheet.Cells(row, 3)
        siteName = actSheet.Cells(row, 4)

        Set OutMail = OutApp.CreateItem(olMailItem)
        With OutMail
            .SendUsingAccount = OutApp.Session.Accounts.Item(1)
            .To = sendEmail
            .CC = ccEmail
            .Subject = subjEmail & " (Site: " & siteName & ")"

            Set outEdit = .GetInspector.WordEditor
            outEdit.Content.Paste

            outEdit.Range(0).InsertBefore ("Dear " & sendName & "," & vbNewLine)

            .Attachments.Add dirAttach

            .Display
            '.Send

        End With
        Debug.Print row

        Set OutMail = Nothing
        Set outEdit = Nothing
    Next row

    docEmail.Close False
    wordApp.Quit
End Sub

Вещи, которые я пробовал на основе предложений:

  • Проверенные настройки Outlook - по умолчанию используется текст HTML
  • Перемещено .display на .GetInspector.WordEditor

person Falthazar    schedule 28.07.2017    source источник
comment
social.msdn.microsoft.com/Forums/vstudio/en-US/   -  person braX    schedule 28.07.2017
comment
Какие у вас настройки электронной почты Outlook - обычный текст или форматированный текст / HTML? Если простой текст, это может быть проблемой. Также убедитесь, что Word является редактором электронной почты по умолчанию (это упоминается в той же теме).   -  person David Zemens    schedule 28.07.2017
comment
@reply Да, я уже проверил эти настройки, они установлены на html.   -  person Falthazar    schedule 28.07.2017
comment
Какая операционная система включена?   -  person 0m3r    schedule 28.07.2017
comment
Мы на Windows 7   -  person Falthazar    schedule 28.07.2017
comment
Можете ли вы опубликовать полный код?   -  person 0m3r    schedule 29.07.2017
comment
Остальная часть кода просто копируется из документа Word. Добавлю в ОП   -  person Falthazar    schedule 31.07.2017


Ответы (4)


Убедитесь, что Word является редактором электронной почты по умолчанию. Из Dox Inspector.WordEditor:

Свойство WordEditor допустимо только в том случае, если метод IsWordMail возвращает True, а свойство EditorType равно olEditorWord. Возвращенный объект WordDocument обеспечивает доступ к большей части объектной модели Word ...

Кроме того, убедитесь, что Outlook настроен для отправки электронных писем в формате RTF или HTML, а не в виде обычного текста.

person David Zemens    schedule 28.07.2017
comment
Это странная вещь. Я увидел это и проверил оба этих свойства, и оба они верны:! Окно локальных переменных - person Falthazar; 28.07.2017
comment
Попробовать добавить outEdit.Display перед попыткой обработать Инспектор? - person David Zemens; 28.07.2017
comment
Или может это .Show, я не могу вспомнить, как это называется. - person David Zemens; 28.07.2017
comment
Это дисплей, и я переместил его над .GetInspector.WordEditor, и проблема все еще та же. - person Falthazar; 28.07.2017
comment
Странный. Ваш код работает у меня в 2016 году (проверено с использованием Outlook с поздним связыванием). На скриншоте я заметил, что ваш WordEditor - пустой объект, но мой явно является объектом / документом, который я могу расширить ... Удостоверились ли вы, что соответствующая ссылка отмечена для версии Outlook и / или Word 2016 года? Если файл Excel был создан с использованием предыдущей справочной библиотеки, возможно, это могло быть проблемой? - person David Zemens; 28.07.2017
comment
Вот что у меня есть в ссылках: ссылки - person Falthazar; 28.07.2017
comment
@Daniel. На данный момент я ничего не могу поделать, кроме проверки настроек центра безопасности / центра управления безопасностью в Outlook, Word ... отображается ли приложение Outlook во время выполнения? - person David Zemens; 28.07.2017
comment
Да, как ни странно. Все остальное вроде работает, кроме этого. Пока у меня нет словарного редактора, он будет работать. Единственная проблема в том, что я не могу вставить с форматированием, не получив редактор слов - person Falthazar; 28.07.2017
comment
Я бы открыл заявку в Microsoft, если возможно, это может быть какая-то ошибка, и есть как минимум один похожий вопрос, опубликованный ранее в этом месяце, на который нет ответа - person David Zemens; 28.07.2017
comment
Кажется, я припоминаю некоторые ситуации, когда Outlook зависает в ожидании ввода пользователя - то есть из запросов автоматизации, подобных этому, у него будет msgbox, предупреждающий владельца о том, что другая программа пытается отправлять электронные письма через Outlook, и приложение Outlook, вероятно, не будет отвечать до тех пор, пока / если вы не позволите. Убедитесь, что чего-то подобного не происходит, если обзор сведен к минимуму, вы можете этого не заметить и т.д. - person David Zemens; 28.07.2017
comment
Спасибо! Кроме того, знаете ли вы, где я сообщаю об ошибке в Microsoft? Я думал здесь, но не уверен, что есть место лучше. - person Falthazar; 28.07.2017

Я не совсем уверен, была ли у меня та же проблема, что и у вас, но после обновления Office 2016 у меня начались сбои при обращении к GetInspector. Чтобы быть ясным, он работал с Office 2016, а затем перестал работать после последнего обновления.

Следующее обходное решение сработало для меня

dim item : set item = Addin.Outlook.CreateItemFromTemplate(Filename)
Outlook.Inspectors.Add(item) ' Outlook is the application object

Кажется, что он работает, только если я добавляю элемент сразу после его создания, устанавливая для него свойства, а затем добавляя его, не сработало.

Примечание: я не тестировал с CreateItem вместо CreateItemFromTemplate. Вторая строка была добавлена ​​и не нужна до обновления Office.

person Marcus    schedule 21.09.2017

Попробуйте переместить редактор к первому действию ... ...

     With OutMail

        Set outEdit = .GetInspector.WordEditor
        outEdit.Content.Paste

        .SendUsingAccount = OutApp.Session.Accounts.Item(1)
        .To = sendEmail
        .CC = ccEmail
        .Subject = subjEmail & " (Site: " & siteName & ")"

...

person Jay Pathmanathan    schedule 01.08.2018
comment
Спасибо! Извините, я решил это некоторое время назад. Оказывается, это был дополнительный параметр безопасности либо из-за Office 2016, либо из-за групповой политики. Вы можете проверить с outApp.isTrusted. Закончил создание отдельной надстройки VSTO, которая только что вернула надежное приложение Outlook. - person Falthazar; 03.08.2018

Проблема: В целях безопасности свойства HTMLBody, HTMLEditor, Body и WordEditor являются предметом запросов безопасности информации об адресе, поскольку тело сообщения часто содержит адреса электронной почты отправителя или других людей. И, если групповая политика не разрешает, эти запросы не появляются на экране. Проще говоря, как разработчик вы обязаны изменить свой код, потому что нельзя вносить изменения в реестр и изменять групповую политику.

Следовательно, если ваш код внезапно перестал работать после перехода на Office 365 или по каким-либо другим причинам, обратитесь к приведенным ниже решениям. Комментарии были добавлены для облегчения понимания и реализации.

Решение 1. Если у вас есть права администратора, попробуйте внести изменения в реестр по ссылке ниже: https://support.microsoft.com/en-au/help/926512/information-for-administrators-about-e-mail-security-settings-in-outlo

Однако, как разработчик, я рекомендую код, который достаточно совместим со всеми версиями Excel, вместо того, чтобы вносить изменения в систему, потому что системные изменения потребуются также на каждом компьютере конечного пользователя.

Решение 2. Совместимость с кодом VBA: Excel 2003, Excel 2007, Excel 2010, Excel 2013, Excel 2016, Office 365.


Option Explicit

Sub Create_Email(ByVal strTo As String, ByVal strSubject As String)


    Dim rngToPicture As Range
    Dim outlookApp As Object
    Dim Outmail As Object
    Dim strTempFilePath As String
    Dim strTempFileName As String

    'Name it anything, doesn't matter
    strTempFileName = "RangeAsPNG"

    'rngToPicture is defined as NAMED RANGE in the workbook, do modify this name before use
    Set rngToPicture = Range("rngToPicture")
    Set outlookApp = CreateObject("Outlook.Application")
    Set Outmail = outlookApp.CreateItem(olMailItem)

    'Create an email
    With Outmail
        .To = strTo
        .Subject = strSubject

        'Create the range as a PNG file and store it in temp folder
        Call createPNG(rngToPicture, strTempFileName)

        'Embed the image in Outlook
        strTempFilePath = Environ$("temp") & "\" & strTempFileName & ".png"
        .Attachments.Add strTempFilePath, olByValue, 0

        'Change the HTML below to add Header (Dear John) or signature (Kind Regards) using newline tag (<br />)
        .HTMLBody = "<img src='cid:DashboardFile.png' style='border:0'>"


        .Display

    End With

    Set Outmail = Nothing
    Set outlookApp = Nothing
    Set rngToPicture = Nothing

End Sub

Sub createPNG(ByRef rngToPicture As Range, nameFile As String)

    Dim wksName As String

    wksName = rngToPicture.Parent.Name

    'Delete the existing PNG file of same name, if exists
    On Error Resume Next
        Kill Environ$("temp") & "\" & nameFile & ".png"
    On Error GoTo 0

    'Copy the range as picture
    rngToPicture.CopyPicture

    'Paste the picture in Chart area of same dimensions
    With ThisWorkbook.Worksheets(wksName).ChartObjects.Add(rngToPicture.Left, rngToPicture.Top, rngToPicture.Width, rngToPicture.Height)
        .Activate
        .Chart.Paste
        'Export the chart as PNG File to Temp folder
        .Chart.Export Environ$("temp") & "\" & nameFile & ".png", "PNG"
    End With
    Worksheets(wksName).ChartObjects(Worksheets(wksName).ChartObjects.Count).Delete

End Sub
person jainashish    schedule 03.06.2020