将 Access 表导出到 Excel,但每个名称都有不同的工作表

Posted

技术标签:

【中文标题】将 Access 表导出到 Excel,但每个名称都有不同的工作表【英文标题】:Export Access table to Excel, but have different sheets for each name 【发布时间】:2021-06-16 15:10:14 【问题描述】:

我想将表格导出到 Excel,但每个名称都有单独的表格。

下面是我找到的代码,但有几个问题。

我想从表中拉取数据,代码设置为拉取查询(我想我可以将 qdef 更改为 TableDef)。 当我尝试编译它时,我收到一条 Invalid outside procedure 消息。
Dim Db As DAO.Database, qdef AS DAO.QueryDef, rst As DAO.Recordset

Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT DISTINCT [CustomerName] FROM [QueryName]")

Do While Not rst.EOF
Set qdef = db.QueryDefs("[MyTempQuery"])
qdef.SQL = "SELECT * FROM [QueryName] WHERE Customer = '" & rst!CustomerName & "'"

Set qdef = Nothing
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "MyTempQuery", _
              "C:\Path\To\Excel\Files\" & rst!CustomerName & ".xlsx", True
rst.MoveNext
Loop

rst.Close
Set rst = Nothing: Set db = Nothing

以下是我所做的更改:

Dim db As DAO.Database, tdef As DAO.TableDef, rst As DAO.Recordset
Set db = CurrentDb
Set rst = db.OpenRecordset("SELECT DISTINCT [DM_NAME] FROM [RD Completed Report TBL]")

Do While Not rst.EOF
Set tdef = db.TableDefs("[My TempQuery]")
tdef.SQL = "SELECT * FROM [RD Completed Report TBL] WHERE DM = '" & rst!DM & "'"

Set qdef = Nothing
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "MyTempQuery", _
              "C:\Path\To\Excel\Files\" & rst!DMS & ".xlsx", True
rst.MoveNext
Loop

rst.Close
Set rst = Nothing: Set db = Nothing

【问题讨论】:

TableDefs 没有 .SQL 属性。为什么需要将 QueryDef 替换为 TableDef?请解释第一段代码的问题。 嗨 Parfait,我遇到的第一个代码块的问题是编译错误:第一个 Set db 的外部过程无效 您在引用的查询名称之外有右括号。 是的,我解决了这个问题,但仍然收到相同的消息 Set 呼叫不能在SubFunction 之外进行。事实上,不清楚您的代码是否封装在子例程或函数中。 【参考方案1】:

与 QueryDef 对象不同,TableDef 没有.SQL 属性。请参阅 MSDN 文档并比较 QueryDef 和 TableDef 的属性。在关系数据库中,table 是存储数据的物理实体,而 query(或 view)本质上是保存的 SQL 脚本(一个或更多语句)用于在稍后运行查询时检索数据。 MS Access 查询只能保存一条 SQL 语句,不存储任何数据。

鉴于两个代码块之间的 SQL 语句不同,您似乎认为 TableDefs 只能查询表,而 QueryDefs 只能查询查询。首先,TableDef 根本无法查询。其次,MS Access 中的QueryDef 可以查询表和/或查询。也就是说,任何SQL 语句都可以从any 表和any 数据库中保存的查询中获取,甚至可以将这两种类型的对象连接起来。下面的示例应该在QueryDef 中工作。因此,如果需要通过 SQL 过滤以将数据导出到 Excel 工作表,请继续使用QueryDefs

单表

SELECT ... FROM [myTable] WHERE ...

单一查询

SELECT ... FROM [mySavedQuery] WHERE ...

两张桌子

SELECT ... 
FROM [myTable] t1
INNER JOIN [myTable] t2 ON t1.ID = t2.ID
WHERE ...

表和查询

SELECT ... 
FROM [myTable] t
INNER JOIN [mySavedQuery] q ON t.ID = q.ID
WHERE ...

两个查询

SELECT ... 
FROM [mySavedQuery] q1
INNER JOIN [mySavedQuery] q2 ON q1.ID = q2.ID
WHERE ...

【讨论】:

以上是关于将 Access 表导出到 Excel,但每个名称都有不同的工作表的主要内容,如果未能解决你的问题,请参考以下文章

从 MS Access 中将交叉表查询结果导出到 Excel

将 Excel 连接导出到 Access - .ODC 信息到 .ODBC

将 Access 表导出到 Excel 错误

Excel VBA 导出到 Access:ADO 错误

使用 VBA 获取 Excel 选项卡名称并复制到 Access 表

将具有多个表的 Access 数据库导出到具有多个工作表的 Excel