Как обрабатывать ошибки в VBA, когда письмо отправляется из Excel через Outlook? - PullRequest
2 голосов
/ 11 декабря 2019

Я пишу макрос VBA для отправки листа Excel в виде вложения электронной почты через Outlook (из Excel). Это работает все отлично, но у меня есть некоторые проблемы с правильной обработкой ошибок. В настоящее время я использую этот (сильно упрощенный) код:

Private Sub SendWorksheetByEmail(sEmail As String)

    'This error handler should make sure that the code always
    'goes through a "clean up" procedure where
    'all settings are reset and temporary files are deleted
    On Error GoTo ErrorHandler

    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    ActiveSheet.DisplayPageBreaks = False

    Dim sFile As String
    Dim wbCopy As Workbook
    Dim OutlookApp As Object, OutlookMail As Object
    '.......some more declarations.................

    'Here comes code that will do some changes in the workbook,
    'then copy one of the sheets to a new workbook (wbCopy) and
    'store the workbook to the temp folder. I guess it is not
    'neccessary in order to understand the question.
    '..............................................
    '..............................................


    'Sending the email
    'I somethines see that people put a "On Error Resume Next" here.
    'Then, the code will always finish - but I do not get an error
    'Message. What is the point of doing this?

    Set OutlookApp = CreateObject("Outlook.Application")
    Set OutlookMail = OutlookApp.CreateItem(0)
    With OutlookMail
        .To = sEmail
        .CC = ""
        .BCC = ""
        .Subject = "Some subject text"
        .Body = "Some email body text"
        .Attachments.Add sFile
        .Send
    End With

    MsgBox "Your email was successfully sent to " & sEmail, vbInformation, "Email sent"

ErrorExit:
    'Various "clean up" (delete temporary file) and restore settings
    On Error Resume Next
    wbCopy.Close
    Kill sFile
    Set OutlookMail = Nothing
    Set OutlookApp = Nothing
    ActiveSheet.DisplayPageBreaks = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.ScreenUpdating = True

    Exit Sub

ErrorHandler:
    MsgBox "An error occured and the email might not have been sent.", vbCritical, "Error"
    Resume ErrorExit

End Sub

Идея состоит в том, что код будет переходить к ErrorHandler (и очистить некоторые настройки, удалить временный файл и т. Д.) Один развозникает ошибка.

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

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

Outlook is not set up and asks to create a user account

Я провел веб-исследование и увидел, что код, отправляющий электронное письмо:часто запускается с оператором On Error Resume Next. Я попробовал это, и код закончил работать на этот раз. Однако мне не удается проверить, было ли отправлено электронное письмо, поэтому пользователь получает окно сообщения с подтверждением, даже если электронное письмо не может быть отправлено.

Что было бы лучше, чтобы код всегда заканчивался? И как я могу проверить, действительно ли электронное письмо было отправлено (для отображения сообщения об ошибке)?

Вся помощь высоко ценится. Спасибо!

1 Ответ

0 голосов
/ 11 декабря 2019

Если вы хотите быть полностью уверены, что ваше письмо отправлено, то, возможно, было бы неплохо проверить, находится ли ваше сообщение в папке «Отправлено» или / и «Исходящие» (см. здесь ). Если там произойдет сбой vba, вы будете знать, что в приложении Outlook может быть ошибка. Если вы отправляете сотни электронных писем одновременно, обратите внимание на папку «Исходящие». Электронные письма хранятся там и отправляются по одному даже после того, как макрос завершит работу.

Следующая большая проверка будет состоять в том, чтобы подождать некоторое время ответа сервера и проверить папку «Входящие» на предмет сообщения об ошибке, если электронная почта была недействительной. Но этот вариант может быть излишним для этой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...