【问题标题】:Sending e-mails to multiple addresses with different pdf attachments将电子邮件发送到具有不同 pdf 附件的多个地址
【发布时间】:2020-12-20 03:24:42
【问题描述】:

我有一个带有命令按钮的 Access 表单,可以打开报告并在本地文件夹中创建 .PDF 文件。每个 .PDF 报告都有不同的名称(1234.pdf、4321.pdf 等)。数字代表员工编号,报告是该员工当前的休假时间余额。所以基本上,我最终在文件夹中有大约 60 个 .PDF 文件,每个文件用于不同的员工。创建这些 .PDF 文件后,我希望通过 Access 将它们通过电子邮件发送给每个员工,并附上他们自己的 .PDF 附件,而不是我在 Outlook 中创建单独的电子邮件并手动附加文件。我知道如何将一个 .PDF 文件附件发送给一个或多个收件人,但不知道如何向单个收件人发送特定的 .PDF 文件附件。我在想也许文件可以在创建后立即发送,然后继续创建下一个文件,等等。我不知道。下面是我用来为每个员工编号创建 .PDF 文件的代码。顺便说一句,员工编号和电子邮件地址存储在同一个员工表中,如果有帮助的话。

Private Sub CmdAllLeavePDF_Click()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim MyFileName As String
Dim mypath As String
Dim temp As String
Dim sNow As String

mypath = "C:\Users\rbryan_2\Desktop\EDM Reports PDF\"

sNow = Format(Now(), "mmddyyyy")

Set db = CurrentDb()

Set rs = db.OpenRecordset("SELECT DISTINCT [TblNames.EmpID] FROM [QurEmpLeaveCurrAll]", dbOpenSnapshot)

Do While Not rs.EOF

temp = rs("TblNames.EmpID")

MyFileName = rs("TblNames.EmpID") & " - " & sNow & ".PDF"

DoCmd.OpenReport "RptEmpLeaveCurrAll", acViewPreview, , "[TblNames.EmpID]='" & temp & "'"
DoCmd.OutputTo acOutputReport, "", acFormatPDF, mypath & MyFileName

DoCmd.Close acReport, "RptEmpLeaveCurrAll", acSaveYes
DoEvents

rs.MoveNext
Loop

rs.Close
Set rs = Nothing
Set db = Nothing

Beep
Eval ("MsgBox ('PDF FILES CREATED!@Individual Employee Leave Totals Reports Were Successfully Created@In The EDM Reports PDF File Folder.@@',64,' Employee Data Management')")
   
Me!CmdN.SetFocus

End Sub

【问题讨论】:

  • 您在显示电子邮件地址的表单上是否绑定了Textbox?表格上包含电子邮件地址的字段的名称是什么?你能给我们看一张你的桌子的截图吗?
  • 表单上没有绑定文本框,它只是一个带有命令按钮的表单,可以根据各种查询打印各种报告。表名称为 TblNames,包含电子邮件地址的字段称为 EmpEmail。包含员工 ID 的字段称为 EmpID。这有帮助吗?

标签: vba ms-access ms-access-2007


【解决方案1】:

由于您已经拥有生成.pdffiles 的代码,因此请使用以下代码将电子邮件发送到带有单独 pdf 的个人电子邮件地址。这里EmpID 是员工编号字段,Email 是员工电子邮件地址字段。如果您的电子邮件字段名称不同,请调整它。

希望您了解Add References Microsoft Outlook x.xx 对象库。

Option Compare Database
Option Explicit

Private Sub cmdSendMails_Click()
Dim oApp As New Outlook.Application
Dim oEmail As Outlook.MailItem
Dim strEmail As String, strAttachment As String
Dim mypath As String

mypath = "C:\Users\rbryan_2\Desktop\EDM Reports PDF\"
'mypath = "C:\Users\Harun.Rashid\Desktop\My PDFs\"

Dim db As DAO.Database
Dim rs As DAO.Recordset

Set db = CurrentDb()
Set rs = db.OpenRecordset("SELECT DISTINCT EmpID, EmpEmail FROM TblNames", dbOpenSnapshot)

    On Error Resume Next 'Suppress errors 
    Do While Not rs.EOF
        strAttachment = mypath & rs!EmpID & ".pdf"  'Pdf name exactly as employee ID.
        strEmail = rs!EmpEmail 'Email address from table column.
        
            Set oEmail = oApp.CreateItem(olMailItem)
            With oEmail
                .Recipients.Add strEmail 'Add email address
                .Subject = "Your subject text here."
                .Body = "Your body text here."
                .Attachments.Add strAttachment 'Attach PDF file.
                '.Send
                .Display 'Use .send to send the mail. Display will show the email editor window.
            End With
            Set oEmail = Nothing
        rs.MoveNext
    Loop

rs.Close
Set rs = Nothing
Set db = Nothing

End Sub

【讨论】:

  • 非常感谢 Harun,我明天试试,我家里的这台电脑上没有 Outlook。我已经引用了 Outlook 对象库,并且能够从 Access 发送 .PDF 报告。我只是和对方有问题。我一定会在明天告诉你这是否有效。再次感谢。
  • @RPHBryan 所以,我建议创建一个命名为cmdSendMails 的新按钮,并使用此代码测试该按钮是否有效。如果可行,则使用您现有的代码部署代码。
  • Harun,经过一些小的调整,代码运行良好,只是它会给我一个错误,如果特定员工编号的 PDF 文件不存在,它就会停止。我尝试将 Nz 放入代码中,但仍然没有运气。 strAttachment = Nz(mypath & MyFileName & rs!EmpID & ".pdf") 也许我放错地方了。
  • 如果找不到特定文件,我希望它转到下一个 EmpID 并且不会出错。
  • @Harun24HR 限制范围。 On Error Resume Next 就在Attachments.Add strAttachment 之前,然后使用On Error GoTo 0 返回正常的错误处理。 cpearson.com/excel/errorhandling.htm
猜你喜欢
  • 1970-01-01
  • 2023-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-14
  • 2018-11-06
  • 2017-04-02
  • 2013-07-17
相关资源
最近更新 更多