如何从同一数据库的 VBA 代码中的 MS ACCESS 中提取字段

Posted

技术标签:

【中文标题】如何从同一数据库的 VBA 代码中的 MS ACCESS 中提取字段【英文标题】:How to pull a field from MS ACCESS in the VBA Code in the same DB 【发布时间】:2013-02-12 08:38:04 【问题描述】:

我在 MS ACCESS 中有一个数据库,其中我有一个包含一些计数的 ECount 字段 有什么办法可以在 VBA 代码中调用该调用,我正在生成一封新邮件,该邮件应该在邮件中提取计数。

Private Sub Command_Click()
Dim objOutlook As Outlook.Application
Dim objEmail As Outlook.MailItem
Dim ThisDay As Date

ThisDay = Format(Now, "mm/dd/yy")


Set objOutlook = CreateObject("Outlook.application")
Set objEmail = objOutlook.CreateItem(olMailItem)

With objEmail
    .To = ""
    .CC = ""
    .Subject = "Daily Email Processed " *(Thisday)
    .Body = "Hi," + vbNewLine + vbNewLine + vbNewLine + "Please find below the number of Emails processed for the  " + vbNewLine + vbNewLine + "Email Count = " (**ECOUNT**) + vbNewLine + "O Count = " (**OCount**)
    .Attachments.Add ""
    .Attachments.Add ""
    .Display
    '.ReadReceiptRequested

End With

【问题讨论】:

ECount 字段在哪里?在表/查询中? 很抱歉它在查询中... 【参考方案1】:
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim sCount As String

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("SELECT TOP 1 ECounter FROM [Email Query]")

If rs1.RecordCount > 0 Then
    rs1.MoveFirst
    sCount = rs1.Fields("ECount")
End If
rs1.Close
set rs1 = Nothing
set db = Nothing

sCount 将保存该值

【讨论】:

出现错误,例如 Set rs1 = db.OpenRecordset("SELECT TOP 1 ECount FROM YourQuery") @ Andrey Gordeev 的参数太少 @user1897472 好了,把ECount换成你想得到的字段名 我第一次这样做了,查询名称也是如此,得到了错误 Set rs1 = db.OpenRecordset("SELECT TOP 1 ECounter FROM Email Query") is what I Have @user1897472 Email Query 是您的查询名称吗? @user1897472 你有一个很好的例子,为什么你不应该在字段/表/查询/报告名称中使用空格。试试这个:Set rs1 = db.OpenRecordset("SELECT TOP 1 ECounter FROM [Email Query]")【参考方案2】:

从表/查询中检索单个字段的最简单方法是使用 Access 的DLOOKUP 函数。

所以你可以写:

.Body = "嗨" + vbNewLine + vbNewLine + vbNewLine + _ "请在下面找到为 " + vbNewLine + vbNewLine + _ 处理的电子邮件数量 "Email Count = " + DLookup("ECount", "SourceTableOrQuery", "Criteria1 = 5 and Criteria2 = ""Test""") + vbNewLine + _ "O 计数 = " + DLookup("OCount", "SourceTableOrQuery")

或者,如果您还没有计数,但想计算项目的数量,您可以使用 'DCount` 函数。

【讨论】:

我在这里遇到错误 --- .Body = "Hi," + vbNewLine + vbNewLine + vbNewLine + "为 " & ThisDay + vbNewLine + vbNewLine + "Email Count = " + DLookup("Ecounter", "Email Query") + vbNewLine + "Outbound Count = " + DLookup("Ecounter", "Email Query") 在即时窗口中执行? DLookup("Ecounter", "Email Query") 会发生什么? Email Query 真的是您的查询名称,而 Ecounter 真的是该字段的名称吗?查询是否只返回一行? 运行时错误 13 类型不匹配,是的,这是查询的名称,Ecounter 是由查询存储在查询中的表达式.. 很难从远程调试,但 DLookup 非常简单 - 稍微尝试一下,你会希望得到正确的语法。在此处查看一些示例:access.mvps.org/access/general/gen0018.htm【参考方案3】:
Dim db As DAO.Database
Dim rs1 As DAO.Recordset
Dim sCount As String

Set db = CurrentDb()
Set rs1 = db.OpenRecordset("SELECT TOP 1 ECounter FROM [Email Query]")

If rs1.RecordCount > 0 Then
    rs1.MoveFirst
    sCount = rs1.Fields("ECount")
End If
rs1.Close
set rs1 = Nothing
set db = Nothing

【讨论】:

以上是关于如何从同一数据库的 VBA 代码中的 MS ACCESS 中提取字段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 VBA 代码中的 ms-access 中执行查询?

如何使用查询或 VBA 和 SQL 更新 MS ACCESS 中的表

我希望从 ms-access 2013 数据库中的所有表单、报告和模块中导出 vba 源代码

从 VBA 代码中转储 MS Access 宏对象信息

从 C#.NET 应用程序调用 MS Access 中的 VBA 代码

从vba中的表填充列表框