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

Posted

技术标签:

【中文标题】MS Access导出联合查询到Excel,VBA问题【英文标题】:MS Access export Union Query to Excel, VBA problems 【发布时间】:2018-12-27 07:40:56 【问题描述】:

我不是程序员,但我正在为工作构建一个 Access 数据库。 数据库现在工作正常,但我正在努力将一个重要的查询导出到 excel。感谢您的帮助,并对不良做法和可能的许多语法错误表示歉意。

从下面名为“今日返工流程”的联合查询中,我创建了一个查询以按名为“今日返工流程查询”的产品代码分组,然后创建另一个查询以添加列以进行一些我希望导出到的计算Excel。

我需要导出的查询名为 "Export Query" 。它看起来像这样:

(产品/开始返工库存/二手返工/新返工/总返工)

这些是从联合查询中得到的数据,然后是分组查询中计算出来的字段。

联合查询代码如下:

SELECT DISTINCTROW 
Batch.[Production Date], Products.[Rework Family] AS [Product Code], 
Batch.[Rework Used] AS [Rework Used TODAY lb 1], Batch.[Support row] AS [Rework Used YESTERDAY lb 1], 
Batch.[Support row] AS [Rework Used TODAY lb 2], 
Batch.[Support row] AS [Rework Used YESTERDAY lb 2], 
Batch.[Support row] AS [New Rework TODAY lb], 
Batch.[Support row] AS [New Rework YESTERDAY lb]
FROM Batch INNER JOIN Products ON Batch.[Rework Product] = Products.[Product ID]
WHERE (((Batch.[Production Date])=[Forms]![01 Production Batch Form]![Today Date]))

UNION ALL

SELECT DISTINCTROW 
Batch.[Production Date], Products.[Rework Family] AS [Product Code], 
Batch.[Support row] AS [Rework Used TODAY lb 1], 
Batch.[Rework Used] AS [Rework Used YESTERDAY lb 1], 
Batch.[Support row] AS [Rework Used TODAY lb 2], 
Batch.[Support row] AS [Rework Used YESTERDAY lb 2], 
Batch.[Support row] AS [New Rework TODAY lb], 
Batch.[Support row] AS [New Rework YESTERDAY lb]
FROM Batch INNER JOIN Products ON Batch.[Rework Product] = Products.[Product ID]
WHERE (((Batch.[Production Date])<[Forms]![01 Production Batch Form]![Today Date]))

UNION ALL

SELECT DISTINCTROW 
Batch.[Production Date], Products.[Rework Family] AS [Product Code], 
Batch.[Support column] AS [Rework Used TODAY lb 1], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 1], 
Batch.[Rework Used 2] AS [Rework Used TODAY lb 2], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 2], 
Batch.[Support column] AS [New Rework TODAY lb], 
Batch.[Support column] AS [New Rework YESTERDAY lb]
FROM Batch INNER JOIN Products ON Batch.[Rework Product 2] = Products.[Product ID]
WHERE (((Batch.[Production Date])=[Forms]![01 Production Batch Form]![Today Date]))

UNION ALL

SELECT DISTINCTROW 
Batch.[Production Date], Products.[Rework Family] AS [Product Code], 
Batch.[Support column] AS [Rework Used TODAY lb 1], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 1], 
Batch.[Support column] AS [Rework Used TODAY lb 2], 
Batch.[Rework Used 2] AS [Rework Used YESTERDAY lb 2], 
Batch.[Support column] AS [New Rework TODAY lb], 
Batch.[Support column] AS [New Rework YESTERDAY lb]
FROM Batch INNER JOIN Products ON Batch.[Rework Product 2] = Products.[Product ID]
WHERE (((Batch.[Production Date])=[Forms]![01 Production Batch Form]![Today Date]))

UNION ALL

SELECT DISTINCTROW Batch.[Production Date], Products.[Rework Family] AS [Product Code], 
Batch.[Support column] AS [Rework Used TODAY lb 1], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 1], 
Batch.[Rework Used 2] AS [Rework Used TODAY lb 2], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 2], 
Batch.[New Rework] AS [New Rework TODAY lb], 
Batch.[Support column] AS [New Rework YESTERDAY lb]
FROM Batch INNER JOIN Products ON Batch.Product = Products.[Product ID]
WHERE (((Batch.[Production Date])=[Forms]![01 Production Batch Form]![Today Date]))

UNION ALL 

SELECT DISTINCTROW 
Batch.[Production Date], Products.[Rework Family] AS [Product Code], 
Batch.[Support column] AS [Rework Used TODAY lb 1], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 1], 
Batch.[Rework Used 2] AS [Rework Used TODAY lb 2], 
Batch.[Support column] AS [Rework Used YESTERDAY lb 2], 
Batch.[Support column] AS [New Rework TODAY lb], 
Batch.[New Rework] AS [New Rework YESTERDAY lb]
FROM Batch INNER JOIN Products ON Batch.Product = Products.[Product ID]
WHERE (((Batch.[Production Date])<[Forms]![01 Production Batch Form]![Today Date]));`

当我在代码中使用“联合查询”导出到 excel 时,我在日期前后添加了 #" & 和 & "#,但出现错误号 3129。 当我在代码中使用“导出查询”时,出现错误 3061 Too little parameters, Expected 1.

这里是导出查询代码:

SELECT DISTINCTROW 
[Rework Flow until Today].[Product Code], 
Sum([Rework Flow until Today].[Rework Used TODAY lb 1]) AS [SumOfRework Used TODAY lb 1], 
Sum([Rework Flow until Today].[Rework Used YESTERDAY lb 1]) AS [SumOfRework Used YESTERDAY lb 1], 
Sum([Rework Flow until Today].[Rework Used TODAY lb 2]) AS [SumOfRework Used TODAY lb 2], 
Sum([Rework Flow until Today].[Rework Used YESTERDAY lb 2]) AS [SumOfRework Used YESTERDAY lb 2], 
Sum([Rework Flow until Today].[New Rework TODAY lb]) AS [SumOfNew Rework TODAY lb], 
Sum([Rework Flow until Today].[New Rework YESTERDAY lb]) AS [SumOfNew Rework YESTERDAY lb]
FROM [Rework Flow until Today]
GROUP BY [Rework Flow until Today].[Product Code];

下面是我的 VBA 代码

Dim SQL As String
Dim rs1 As DAO.Recordset
SQL = " One of the queries here "
Set rs1 = CurrentDb.OpenRecordset(SQL, dbOpenSnapshot)

谢谢

【问题讨论】:

为什么要打开记录集?您如何使用它导出到 Excel? 我正在从在线教程中学习并自行解决。我不知道为什么......这是代码: Dim i As Integer i=5 Set xlBook = xlApp.Workbooks.Add Set xlSheet = xlBook.Worksheets(1) with xlsheet Do While Not rs1.EOF .Range("A" & i). Value = Nz(rs1![Product Code], "") .Range("B" & i) ..... C, D, E, etc.. i = i + 1 rs1.MoveNext 【参考方案1】:

使用具有动态参数的查询打开记录集的 VBA 将不起作用,如果序列中的任何查询具有动态参数,也将不起作用。不要将过滤条件放在查询中,将其放在打开记录集的代码中。

SQL = "SELECT * FROM queryname WHERE [Production Date]=#" & [Forms]![01 Production Batch Form]![Today Date] & "#"

很遗憾,[生产日期] 字段在最终查询中不可用。备选方案: 1. 转移电子表格 2. 将记录写入“临时”表 - 表是永久的,记录是临时的 3. 导出使用最终查询作为其 RecordSource 的报表对象

【讨论】:

我遇到的问题是一列基于今天的日期,另一列基于昨天的日期,依此类推。现在,由于我已经有一个查询正在运行并生成我需要的数据,是否可以使用另一种方法将其导出到 excel 中? 拉入查询的列不是问题。它是过滤条件。您在所有 SELECT 语句中使用相同的筛选条件。请参阅我编辑的答案中的选项。 我成功使用了临时表选项。也许不是最优雅的解决方案,但非常实用并且完成了工作。非常感谢。 这是一个多用户数据库吗?如果是这样,则必须拆分数据库,并且临时表位于前端。否则,多个同时的用户将相互冲突,将记录写入位于后端的共享表中。

以上是关于MS Access导出联合查询到Excel,VBA问题的主要内容,如果未能解决你的问题,请参考以下文章

使用 vba 将 MS Access 查询输出到 Excel

将 MS Access 查询导出到 Excel

将 MS-Access 表单结果导出到 Excel?

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

使用 VBA 将 MS Access 记录集导出到 Excel 中的多个工作表/选项卡会生成只读文件

使用 VBA 或 PowerShell 将所有 MS Access SQL 查询导出到文本文件