将 Access 和 Outlook 与 VBA 集成以进行定期报告

Posted

技术标签:

【中文标题】将 Access 和 Outlook 与 VBA 集成以进行定期报告【英文标题】:Integrating Access and Outlook with VBA for regular reporting 【发布时间】:2012-08-27 18:08:55 【问题描述】:

我希望将一些 VBA 代码放在一起,以便一次发送一堆电子邮件。这些电子邮件每个都有多个附件和多个收件人。

我在 Access 中有一个表,其中主键是“电子邮件报告名称”列表,每列包含此电子邮件报告发送到的电子邮件地址。

在另一个表中,我还有“电子邮件报告名称”,每列是要附加到该电子邮件的文件的硬盘驱动器上的文件路径。

我还有两个查询,它们调用这些表并通过自定义函数填充到条件字段中的电子邮件报告名称进行过滤。

我的 Outlook 编码工作正常,可以从 Access 发送电子邮件。但我完全不知道如何让它遍历不同的“电子邮件报告名称”,然后从这些查询中提取相关信息以填写收件人列表和附件列表。

很抱歉没有包含任何示例代码,但我在这方面真的很迷茫,甚至不知道从哪里开始。

如果有没有 SQL 的纯 VBA 解决方案,那将是理想的。我还不知道任何 SQL,所以即使我确实让它开始工作,我也很难根据需要修改代码。

谢谢,


SELECT FilePaths.MailItem, FilePaths.FilePath1, 
       FilePaths.FilePath2, FilePaths.FilePath2, 
       FilePaths.FilePath4, FilePaths.FilePath5, 
       FilePaths.FilePath6, FilePaths.FilePath7,
       FilePaths.FilePath8, FilePaths.FilePath9, 
       FilePaths.FilePath10, FilePaths.FilePath11, 
       FilePaths.FilePath12, FilePaths.FilePath13, 
       FilePaths.FilePath14, FilePaths.FilePath15, 
       FilePaths.FilePath16 
FROM FilePaths 
WHERE (((FilePaths.MailItem)=EmailItemSelect()));

【问题讨论】:

至少贴出“调用这些表”的两个查询的sql 当您对字段名称(field1、field2 等)进行编号时,这通常是设计错误的标志。 电子邮件报告名称表是什么样的? 有两个表。两者中的第一列都是 MailItems,它是两者的主键。在一个表中,第一列之后的每一列是 FilePath1、FilePath2 等。在另一个表中,第一列之后的每一列是 EmailAddress1、EmailAddress2 等。我可以以任何方式重新格式化这些,使这更容易。我以这种方式设置它,以便可以将一个变量放入“EmailItemSelect()”函数中,让两个查询提取必要的信息。 这很令人困惑。说您希望将附件 FilePath1 发送到 FilePath16 到 EmailAddress1 到 EmailAddress 是否正确? 【参考方案1】:

设置表格的最佳方式是以下几行:

电子邮件地址

ID 
EmailAddress
OtherDetails

文件路径

ID
MailItem
FilePath

电子邮件地址文件路径

FilePathID
AddressID

我不太了解 mailitem 是什么,所以我把它留在里面了。

表 EmailaddressFilepath 包含匹配哪个地址接收哪些项目。

电子邮件地址

ID     EmailAddress    OtherDetails
1      joe@example.com Joe Bloggs

文件路径

ID    MailItem    FilePath
1     Help        z:\docs\help.doc
2     More help   z:\docs\morehelp.doc

电子邮件地址文件路径

FilePathID    AddressID
   1              1
   2              1

然后你需要一些代码

Dim rs As Recordset
Dim db as Database

''Something like
sSQL="SELECT EmailAddress, Filepath " _
    & "FROM ( EmailaddressFilepath " _
    & "INNER JOIN EmailAddresses ON " _
    & "EmailaddressFilepath.AddressID = EmailAddresses.ID) " _
    & "INNER JOIN Filepaths ON EmailaddressFilepath.FilePathID = Filepaths.ID " _
    & "WHERE FilePathID=1"


Set rs = db.Openrecordset(sSQL)

'You now have a recordset with email addresses and attachments
'there would be other approaches, but this will do for now.

 Do While Not rs.EOF
     sEmail=rs!Email
     'set up outlook email

     Do While rs!Email=sEmail
     ''Attachment
         sAttach=rs!Filepath 
         rs.MoveNext
         If rs.Eof Then
            exit loop
         End if
     Loop
 Loop

【讨论】:

我如何使用它来创建发送给多个收件人的电子邮件,每封电子邮件都有多个附件? 这很简单,只需一分钟。 非常感谢!我刚刚得到这个工作。有没有办法让我在这里发布最终的工作代码供其他人查看? 您可以发布自己问题的答案,只需选择添加答案即可。 刚开始把它放在一起,我意识到用这种方法我需要在 EmailAddressFilePath 表中手动输入大约 10,000 个不同的值才能工作......嗯......跨度>

以上是关于将 Access 和 Outlook 与 VBA 集成以进行定期报告的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 保存和关闭办公程序(word、excel、access、outlook)以进行备份

MS Outlook 干扰 Access vba 程序

从 Access 中的 VBA 调用时 Outlook.exe 进程未结束

从 MS Access 2016 VBA 启动 Outlook 2016 触发“另一个程序正在使用 Outlook”并死掉

使用 VBA 禁用 Outlook 安全设置

通过 Outlook 向 Access 报告的特定页面发送电子邮件