使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询

Posted

技术标签:

【中文标题】使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询【英文标题】:Query MS Access using Excel VBA, SQL BETWEEN dates query 【发布时间】:2017-12-07 22:40:12 【问题描述】:

全部--

我正在尝试使用 SQL 查询将记录从 Access 数据库中提取到 Excel VBA 用户表单列表框中,使用以下代码:

Sub FillLBBillIDs()
'build bill ID list box with bill IDs available in database, based on client and/or date range
'<---------------------------------------------------Dimension all variables
Dim con As Object, cmd As Object, rst As Object
Dim Path As String, CName As String
Dim FromDate As Date, ToDate As Date
Dim X As Long, Y As Long
'<---------------------------------------------------Define Default Variables
X = 0
CName = AuditParametersFRM.CBOCxName.Value
FromDate = AuditParametersFRM.DTPFrom.Value
ToDate = AuditParametersFRM.DTPTo.Value
'<---------------------------------------------------Define Access connection
Set con = CreateObject("ADODB.Connection"): Set cmd = CreateObject("ADODB.Command"): Set rst = CreateObject("ADODB.RecordSet"):
Path = Sheets("AuditTool").Range("B2").Value
'<---------------------------------------------------Open Access connection
con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & Path & ";Persist Security Info=False;"
con.ConnectionTimeout = 0: con.CommandTimeout = 0: con.Open: cmd.CommandTimeout = 0: Set cmd.ActiveConnection = con
'<---------------------------------------------------Find all bill IDs in the database which match the selected client and
'<---------------------------------------------------are within the consolidated date range
rst.Open "SELECT DISTINCT AdHocReport.[BillID] FROM AdHocReport WHERE AdHocReport.[CxName] = '" & CName & "' AND AdHocReport.[ConsolidationDate] BETWEEN #" & FromDate & "# AND #" & ToDate & "#", con, 1, 3
On Error Resume Next
rst.MoveLast
rst.MoveFirst
Y = 0
Y = rst.RecordCount
AuditToolFRM.LBBillIDs.Clear
If Not Y = 0 Then
    Do Until rst.EOF
'<---------------------------------------------------Build the listbox with the acquired information
        With AuditToolFRM.LBBillIDs
            .AddItem
            .List(X, 0) = rst![BillID]
            X = X + 1
        End With
        rst.MoveNext
    Loop
End If
rst.Close
On Error GoTo 0
con.Close
End Sub

如果我使用大于参数,这段代码就可以正常工作,因此:

rst.Open "SELECT DISTINCT AdHocReport.[BillID] FROM AdHocReport WHERE AdHocReport.[CxName] = '" & CName & "' AND AdHocReport.ConsolidationDate > #" & FromDate & "#", con 1, 3

我已经浏览了该站点上的所有相关问题,但找不到任何可行的方法。有什么想法吗?

提前致谢!

2017 年 12 月 8 日 12:54

我进行了更多测试,但大于查询似乎也不起作用;它会提取满足第一个条件的所有记录,而忽略第二个条件,即使使用括号括住第二个条件也是如此。这告诉我问题肯定出在查询的日期部分。非常感谢任何帮助!

【问题讨论】:

【参考方案1】:

访问中

DATE_FIELD BETWEEN #2/2/2012# AND #2/4/2012# 

一样
DATE_FIELD >=#2/2/2012# AND <=#2/4/2012#

当您在日期范围语法周围有另一个 AND 时。

rst.Open "SELECT DISTINCT AdHocReport.[BillID] FROM AdHocReport WHERE AdHocReport.[CxName] = '" &amp; CName &amp; "' AND (AdHocReport.[ConsolidationDate] BETWEEN #" &amp; FromDate &amp; "# AND #" &amp; ToDate &amp; "#)", con, 1, 3

【讨论】:

感谢您的意见!我将继续使用括号,但我使用它们修改了我的代码,然后尝试用 >= AND = #11/1/2017# AND (AdHocReport.[ConsolidationDate] 此处打印的内容不正确。而且您忘记了日期值的文本表达式的格式。 嗨,古斯塔夫!上面的陈述是对所读内容的反映;这是一条错误消息,而不是导致错误消息的代码。这就是为什么它读取“客户端名称”而不是“”和 CName 和“”。不过感谢您的点评!【参考方案2】:

在 ADO 中,您必须在日期值的字符串表达式中使用 ISO 序列:

... "' AND AdHocReport.[ConsolidationDate] BETWEEN #" & Format(FromDate, "yyyy\/mm\/dd") & "# AND #" & Format(ToDate, "yyyy\/mm\/dd") & "#" ...

【讨论】:

感谢您的意见!我更新了查询以格式化日期参数,但它仍然没有提取我确定的适合此查询的记录。问题可能出在我的尺寸标注或定义的变量上吗? 抱歉不理解,但是“生成”的 SQL 是什么意思? 您的代码生成、构建或连接的 SQL。 谢谢,古斯塔夫!我能够确定错误根本不在我的原始代码中,而是在记录集中。

以上是关于使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询的主要内容,如果未能解决你的问题,请参考以下文章

MS Access导出联合查询到Excel,VBA问题

如何使用sql语句和vba将数据从MS-Access导入excel power查询?

MS Access VBA 导出查询结果

Excel VBA 连接到 MS Access(读/写)到多用户表/查询

MS Access VBA 修改 Excel 工作表而不写入 Drive

将 MS Access 查询导出到 Excel