У меня есть база данных сотрудников, которая создает (среди прочего) ежемесячные платежные ведомости и индивидуальные платежные ведомости. Индивидуальная расчетная ведомость — это отчет, основанный на запросе, который выполняет всю фильтрацию (месяц, сотрудник), выбирая входные параметры из несвязанной формы с полями месяца и сотрудника.
Отчет о платежной ведомости открывается в режиме просмотра отчета (не в режиме предварительного просмотра для печати) и имеет единственную командную кнопку, которая сохраняет отчет в формате 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, а затем создать набор отдельных электронных писем, каждое из которых содержит конкретную платежную ведомость в качестве вложения), пройдя через набор записей - но это выходит за рамки Мое понимание...
Вы сохраняете отчет как
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. и в Проводнике отключите параметр «скрывать расширения файлов для известных типов файлов». Это приводит только к путанице.