首页 > 解决方案 > MS Access VBA / SQL 电子邮件功能

问题描述

我正在 MS Access 中构建一个数据库,员工使用它来记录日常条目、访问客户信息等。数据库的两个主要功能是 Distro(替换旧的 Excel Distro Matrix)和自定义电子邮件报告功能。

电子邮件报告功能旨在在 Outlook 中打开新邮件并自动生成收件人、抄送、主题行和邮件正文等字段。Button 本身位于一个表单上,员工不与数据库的表本身进行交互,并且可以简单地从组合框中的报告列表中选择,然后单击“电子邮件报告”。

由于我的数据库结构,我的问题很复杂。组合框是每天发送的报告列表,用户无法编辑。Distro 是一个结构如下的表:人员/实体(名称)、联系信息(电子邮件地址),其余列是包含 True/False 复选框的报告类型。最终,每个接收人都按姓名、联系电子邮件列出,并且根据他们收到的报告,他们在每个报告列下都选中了复选框。

我需要设计一个执行以下操作的函数:检查从表单上的组合框中选择了哪些报告,在 Outlook 中打开一封新电子邮件,查询 Distro Table 以查看谁被选中以接收所选报告,最后收集那些特定的电子邮件地址并将它们插入到正确位置(收件人、抄送)的邮件中,同时还根据从原始组合框中选择的报告生成电子邮件主题行和邮件正文。

标签: sqldatabasevbams-access

解决方案


如果您希望您的数据库更合理且更易于使用,我建议 Distro 表只有名称和电子邮件地址和 ID。

因此,创建另一个表 [Distro Reports],其中包含 2 个字段:[Person ID] 是连接到 Distro.ID 的数字,[Report name] 是保存报告名称。

对于您的组合框行源文件,请使用以下内容:

SELECT [Name] 
FROM MsysObjects
WHERE [Type] = -32764

要提取每个报告的电子邮件地址列表,请使用以下命令:

Private Sub Command13_Click()
Dim Selected_Report As String
Dim SqlStr As String
Dim EmailList As ADODB.Recordset

Dim olApp As Object
Dim olMailItm As Object

Selected_Report = Form_MainForm.ReportListCombo.ItemData(0)
'....... Export report as PDF ......
SqlStr = "SELECT Distro.[Contact Info] " & _
    " FROM Distro INNER JOIN [Distro Reports] ON " & _
    "   [Distro Reports].[Person ID] = Distro.ID " & _
    " WHERE [Distro Reports].[Report Name] = [" & Selected_Report & "];"
CurrentDb.QueryDefs("EmailList").SQL = SqlStr
Set EmailList = CurrentDb.OpenRecordset("EmailList")
Set olApp = CreateObject("Outlook.Application")
Set olMailItm = olApp.CreateItem(0)
With olMailItm
    .cc = ""
    While Not EOF(EmailList)
        .cc = .cc & ";" & EmailList(0)
        ٍEmailList.MoveNext
    Wend
    EmailList.Close
    .subject = "Your subject"
    .Attachments.Add Path2Report, olByValue, 0
    ' for simple text:
    .body = ""
    ' for reached text style:
    .htmlbody = ""
    .display
End With
End Sub

要将报告导出为 PDF,请参见以下链接: 运行代码时将访问报告导出到保存的 PDF 文件的简单 VBA 代码


推荐阅读