Экспорт отчета о доступе в формате pdf и прикрепление к электронной почте Outlook с помощью VBA

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

Отчет о платежной ведомости открывается в режиме просмотра отчета (не в режиме предварительного просмотра для печати) и имеет единственную командную кнопку, которая сохраняет отчет в формате PDF в определенную папку, запускает Outlook и форматирует сообщение электронной почты (кому, тема, текст и т. д.).

Пока все хорошо - командная кнопка сохраняет отчет в формате PDF в указанную папку, правильно называет его, открывает электронную почту Outlook, правильно форматирует электронную почту ... но нет вложения!

Вот код командной кнопки отчета:


Option Compare Database
Option Explicit

Private Sub cmdEmailPayslip_Click()

On Error GoTo cmdEmailPayslip_Error
    
Dim O As New Outlook.Application
Dim M As Outlook.MailItem
Dim Msg As String
Dim aTextBody As String
Dim myPath As String
Dim myFile As String
Dim mySubject As String

    mySubject = Me.FirstName.Column(1) & " " & Me.LastName.Column(1) & _
    " - Payslip for " & Format$(Forms!fSF!SFrom, "mmmm yyyy")
    
    aTextBody = "Dear " & Me.FirstName.Column(1) & "," & _
    Chr(10) & Chr(10) & "Please find attached your payslip for the month of " & _
    Format$(Forms!fSF!SFrom, "mmmm yyyy") & _
    Chr(10) & Chr(10) & "Best regards," & _
    Chr(10) & Chr(10) & "CIVIC EA OPS Team!"

    myPath = "C:\Payroll PESA\Payslips"
    
    myFile = Format$(Date, "yyyymmdd") & " - " & Me.FirstName.Column(1) & " - Payslip for " & Format$(Forms!fSF!SFrom, "mmmm yyyy")
    
    DoCmd.OutputTo acOutputReport, "rPayslips", acFormatPDF, myPath & "\" & myFile & ".pdf", False
    
Set O = New Outlook.Application
Set M = O.CreateItem(olMailItem)
    
On Error Resume Next

With M
    .Body = aTextBody                                    'Set body text
    .To = Me.REmail                                      'Set email address
    '.Cc = ""                                            'Set email CC address
    .Subject = mySubject                                 'Set subject
    .Attachment.Add myPath & "\" & myFile
    .Display
End With

Set M = Nothing
Set O = Nothing

'Show message
MsgBox "The email message has been sent successfully.  ", vbInformation, "EMail message"

cmdEmailPayslip_Error:
    Resume Next

End Sub


Я пробовал довольно много перестановок, но это не сработало.

Что я делаю не так?

Спасибо заранее.

Возможно, я изменю свой подход и попытаюсь создать отдельные платежные ведомости в формате PDF (и сохранить их в указанной папке с собственными именами каждого файла PDF, а затем создать набор отдельных электронных писем, каждое из которых содержит конкретную платежную ведомость в качестве вложения), пройдя через набор записей - но это выходит за рамки Мое понимание...

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы сохраняете отчет как

myPath & "\" & myFile & ".pdf"

но попробуйте добавить это вложение:

myPath & "\" & myFile

Если вы не запустите этот код после On Error Resume Next (и если ваш обработчик ошибок будет состоять из более чем Resume Next), он покажет вам ошибку «невозможно открыть файл».


Во всех случаях, подобных этому, когда вы создаете файл, а затем используете его, всегда рекомендуется хранить полный путь\имя файла в переменной, чтобы подобные ошибки не могли произойти.

sFullPath = myPath & "\" & myFile & ".pdf"
DoCmd.OutputTo acOutputReport, "rPayslips", acFormatPDF, sFullPath, False
'...
.Attachment.Add sFullPath 

P.S. и в Проводнике отключите параметр «скрывать расширения файлов для известных типов файлов». Это приводит только к путанице.

Другие вопросы по теме