Я пишу макрос 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, макрос не будет продолжать работать.
Я провел веб-исследование и увидел, что код, отправляющий электронное письмо:часто запускается с оператором On Error Resume Next
. Я попробовал это, и код закончил работать на этот раз. Однако мне не удается проверить, было ли отправлено электронное письмо, поэтому пользователь получает окно сообщения с подтверждением, даже если электронное письмо не может быть отправлено.
Что было бы лучше, чтобы код всегда заканчивался? И как я могу проверить, действительно ли электронное письмо было отправлено (для отображения сообщения об ошибке)?
Вся помощь высоко ценится. Спасибо!