Как обрабатывать вложения. Добавлять ошибки при подготовке письма через Excel - PullRequest
0 голосов
/ 30 апреля 2020

Я использую код от Рона де Брюина , чтобы подготовить почтовый отчет в Outlook из файла Excel.

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

Чтобы обработать возможность вложения, я добавил к строке Рона де Брюина эту строку, где mAtt - строка, содержащая местоположение файла для присоединения:

If mAtt <> vbNullString Then .Attachments.Add mAtt,0

Хотя он правильно обрабатывает любой вызов подпрограммы с аргументом mAtt, равным «» (в этом случае я хочу подготовить почту БЕЗ вложения), я не получаю никакого результата, если предоставлена ​​строка, но файл не может быть найдено (недоступные файловые серверы или несуществующий файл). Почтовый объект просто не отображается.

С обработкой ошибок ничего не происходит (хотя я вижу, к моменту выполнения или пошагового выполнения, что код правильно выполняет часть процедуры RangeTo Html). Без обработки ошибок он просто останавливается на приведенной выше строке, как и следовало ожидать.

Я хотел бы, чтобы мой код включал go в случае проблемы с вложением, и по-прежнему отображать почту Outlook, готовую к отправке. отправлено, несмотря на отсутствие вложений.

Есть ли лучший способ управления вложениями. Добавление функции VBA?

Вот мой полный код.

Sub PrepareOutlookMail(mTo As String, mCC As String, mSub As String, mAtt As String, mTab As Range, Optional mailBegin As String, Optional mailEnd As String)
'For Tips see: http://www.rondebruin.nl/win/winmail/Outlook/tips.htm
'Don't forget to copy the function RangetoHTML in the module.
'Working in Excel 2000-2016
    Dim OutApp As Object
    Dim OutMail As Object

    If mTab Is Nothing Then
        MsgBox "The selection is not a range or the sheet is protected" & _
               vbNewLine & "please correct and try again.", vbOKOnly
        Exit Sub
    End If

    With Application
        .EnableEvents = False
        .ScreenUpdating = False
    End With

    Set OutApp = CreateObject("Outlook.Application")
    Set OutMail = OutApp.CreateItem(0)

    On Error Resume Next
    With OutMail
        .To = mTO
        .CC = mCC
        .Subject = mSub
        If mAtt <> vbNullString Then .Attachments.Add mAtt,0
        .HTMLBody = mailBegin & RangetoHTML(mTab) & mailEnd
        .Display
    End With
    On Error GoTo 0

    With Application
        .EnableEvents = True
        .ScreenUpdating = True
    End With

    Set OutMail = Nothing
    Set OutApp = Nothing
End Sub

ДОБАВИТЬ Я также пытался добавить условие для проверки существования файла, как советовали некоторые другие ответы о VBA.

If mAtt <> vbNullString And Len(Dir(mAtt,vbDirectory)) <> 0 Then .Attachments.Add mAtt,0

Тем не менее, это не меняет поведение: ничего не отображается. Когда я активирую ошибки, я сталкиваюсь с ошибкой времени выполнения '52': неверное имя файла или номер .

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Мне, наконец, удалось решить мою проблему, хотя я точно не понимаю, почему решение работает.

Я просто добавил ВТОРОЙ обработчик ошибок вокруг проблемы вложения в формате GoTo, и теперь он работает ( Появляется электронная почта Outlook, без вложений, конечно, вместо того, чтобы ничего раньше).

Я не понимаю, почему это работает по-другому, поскольку ведет себя точно так же, как и при первоначальной обработке ошибок Resume Next при обычной обработке. Тем не менее, это решает проблему.

    On Error Resume Next
    With OutMail
        .To = mTo
        .cc = mCC
        .subject = mSub
        On Error GoTo hello: 'New error handling added to my initial code
        If mAtt <> vbNullString And Dir(mAtt) <> "" Then .Attachments.Add mAtt Else Resume Next
hello: 'The new error handling behaves de facto like a Resume Next...
        .HTMLBody = mailBegin & RangetoHTML(mTab) & mailEnd
        .Display
    End With
    On Error GoTo 0
0 голосов
/ 01 мая 2020
If mAtt <> vbNullString And Len(Dir(mAtt,vbDirectory)) <> 0 Then .Attachments.Add mAtt,0

Даже если приведенный выше тест vbNullString не пройден, тест Dir () все еще выполняется - вам нужно разделить его на два отдельных теста:

If Len(mAtt) > 0 Then
    If Len(Dir(mAtt,vbDirectory)) <> 0 Then 
        .Attachments.Add mAtt,0
    End If
End If  

Редактировать: если вы получаете пути, которые вы можете не иметь доступа, то как то так должно работать

Dim f
If Len(mAtt) > 0 Then
    On Error Resume Next
    f = Dir(mAtt)
    On Error Goto 0
    'Len(f) will be 0 if file does not exist or is unreachable
    If Len(f) <> 0 Then .Attachments.Add mAtt,0
End If  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...