【发布时间】:2018-07-11 23:08:59
【问题描述】:
我有一个非常奇怪的问题。我有一个 Access 数据库(2013 64 位 .accdb) 以及基于其他查询“Q_ManifestedByStatus”的几个查询
所有查询在 Access 中都按预期工作,所以这里没有问题。
问题是当我使用 ADODB 连接将数据提取到 Excel(2013 64 位)时。其中一个查询具有“WHERE”子句 [PO No] LIKE '8*'。 当 sql 代码嵌入到 VBA 中时,它可以正常工作,当 sql 被访问时的查询名称替换时,它不会。
当我从访问中删除 WHERE 子句时,两种方式都可以正常工作... 当我将 LIKE 子句更改为 NOT LIKE 时,两种方式都可以正常工作...
欢迎提出任何建议!
请参阅下面的代码。
访问 SQL:
SELECT
Int([Collection date]) AS [Date],
Sum(IIf([Status]="Early",1,0)) AS Early,
Sum(IIf([Status]="On Time",1,0)) AS [On Time],
Sum(IIf([Status]="Late",1,0)) AS Late,
Sum(IIf([Status]="Not Manifested",1,0)) AS [Not Manifested],
[Early]+[on time]+[late]+[not manifested] AS [Sum],
Round([Early]/[Sum],2)*100 & "%" AS [Early%],
Round([On Time]/[Sum],2)*100 & "%" AS [On Time%],
Round([Late]/[Sum],2)*100 & "%" AS [Late%],
Round([Not Manifested]/[Sum],2)*100 & "%" AS [Not Manifested%]
FROM Q_ManifestedByStatus
WHERE [PO No] Like '8*' Or [PO No] Like '9*'
GROUP BY Int([Collection date]);
VBA - SQL 嵌入式 - 工作
Sub tt()
Dim objAdoCon As Object
Dim rst As Object
Dim provider As String
Dim sql As String
sql = "SELECT Int([Collection date]) AS [Date], Sum(IIf([Status]=""Early"",1,0)) AS Early," & _
"Sum(IIf([Status]=""On Time"",1,0)) AS [On Time], Sum(IIf([Status]=""Late"",1,0)) AS Late," & _
"Sum(IIf([Status]=""Not Manifested"",1,0)) AS [Not Manifested], [Early]+[on time]+[late]+[not manifested] AS [Sum]," & _
"Round([Early]/[Sum],2)*100 & ""%"" AS [Early%], Round([On Time]/[Sum],2)*100 & ""%"" AS [On Time%], Round([Late]/[Sum],2)*100 & ""%"" AS [Late%]," & _
"Round([Not Manifested]/[Sum],2)*100 & ""%"" AS [Not Manifested%] FROM Q_ManifestedByStatus WHERE [PO No] NOT Like '8*' GROUP BY Int([Collection date]);"
Set objAdoCon = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
If Application.Version = 15# Then provider = "Provider = Microsoft.ACE.oledb.12.0;" Else provider = "Provider = Microsoft.ACE.oledb.4.0;"
objAdoCon.Open provider & "Data Source = C:\Users\pplusa\Documents\SupplierCompliace.accdb"
'Get 81 POs data
'Daily
Worksheets("81 POs Daily").Select
Cells.Delete
rst.Open sql, objAdoCon
Range("A2").CopyFromRecordset rst
For i = 0 To rst.Fields.Count - 1
Range(Cells(1, i + 1).Address).Value = rst.Fields.Item(i).Name
Next i
Cells.EntireColumn.AutoFit
rst.Close
End Sub
VBA - 按查询名称 - 不起作用
Sub tt()
Dim objAdoCon As Object
Dim rst As Object
Dim provider As String
Set objAdoCon = CreateObject("ADODB.Connection")
Set rst = CreateObject("ADODB.Recordset")
If Application.Version = 15# Then provider = "Provider = Microsoft.ACE.oledb.12.0;" Else provider = "Provider = Microsoft.ACE.oledb.4.0;"
objAdoCon.Open provider & "Data Source = C:\Users\pplusa\Documents\SupplierCompliace.accdb"
'Get 81 POs data
'Daily
Worksheets("81 POs Daily").Select
Cells.Delete
rst.Open "Q_ManifestedByDate81", objAdoCon
Range("A2").CopyFromRecordset rst
For i = 0 To rst.Fields.Count - 1
Range(Cells(1, i + 1).Address).Value = rst.Fields.Item(i).Name
Next i
Cells.EntireColumn.AutoFit
rst.Close
End Sub
【问题讨论】: