Ms access 如何基于变量Access 2007填充电子邮件正文

Ms access 如何基于变量Access 2007填充电子邮件正文,ms-access,vba,ms-access-2007,Ms Access,Vba,Ms Access 2007,我正在编写一个Access 2007应用程序,它发送一封电子邮件,并根据一个变量选择电子邮件的正文。我将每个可选电子邮件存储在一个表中。我当前的代码如下所示: Dim MyMail As Outlook.MailItem Dim WhatEmail As Integer Set WhatEmail = 3 MyMail.Body = "SELECT [Emails].[Body] FROM [Emails] WHERE EmailNumber = WhatEmail" “我的电子邮件”表

我正在编写一个Access 2007应用程序,它发送一封电子邮件,并根据一个变量选择电子邮件的正文。我将每个可选电子邮件存储在一个表中。我当前的代码如下所示:

Dim MyMail As Outlook.MailItem

Dim WhatEmail As Integer

Set WhatEmail = 3

MyMail.Body = "SELECT [Emails].[Body] FROM [Emails] WHERE EmailNumber = WhatEmail"
“我的电子邮件”表有两列EmailNumber(整数)和Body

我收到一个编译错误:

应为:行号、标签、语句或语句结尾


你的代码不会做任何有意义的事情;您的
“SELECT…”
语句只是一个字符串,并且(如果代码确实有效),它会将消息正文设置为:
“SELECT[Emails].[body]…”

想必根本不是你想要的

相反,我们必须使用DAO(或类似工具)从数据库中获取消息体

Public Sub sendMail()

    Dim WhatEmail As Integer
    Dim strSQL As String, strMessageBody As String
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim oApp As Outlook.Application
    Dim oMail As MailItem

    WhatEmail = 2

    strSQL = "SELECT [Body] FROM [Emails] WHERE EmailNumber = " & WhatEmail

    Set db = CurrentDb
    Set rs = db.OpenRecordset(strSQL)

    If (rs.EOF And rs.BOF) Then
        Debug.Print "No matching email found"
        Exit Sub
    End If

    rs.MoveFirst
    strMessageBody = rs![Body]        
    rs.Close
    Set rs = Nothing
    Set db = Nothing

    Set oApp = CreateObject("Outlook.Application")
    Set oMail = oApp.CreateItem(olMailItem)

    oMail.Body = strMessageBody
    oMail.Subject = "subject of email"
    oMail.To = "name@domain.com"
    oMail.Send

    Set oMail = Nothing
    Set oApp = Nothing

End Sub

关于更改原始文件的注意事项:

变量
WhatEmail
现在位于字符串的引号之外,因此VBA使用变量的值,而不是文本“WhatEmail”。这意味着我们将
strSQL
设置为

"SELECT [Body] FROM [Email] WHERE EmailNumber = 2"
(或设置WhatEmail变量的任何数字),而不是

"SELECT [Body] FROM [Email] WHERE EmailNumber = WhatEmail"
然后,我们使用DAO加载一个记录集,并将此SQL字符串作为参数。它希望只返回一条记录(我们的
电子邮件
表中的正确行)-但是如果出现问题并且表中没有匹配的
电子邮件号码
,我们将在即时窗口中收到一条消息(“找不到匹配的电子邮件”),该过程将退出

否则,我们将查看表中的记录(
rs.MoveFirst
),然后使用
rs![正文]

注意:我假设在
Emails
表中最多有一个条目具有匹配的EmailNumber-在我的数据库中,它是主键