DoCmd.TransferSpreadsheet 问题

Posted

技术标签:

【中文标题】DoCmd.TransferSpreadsheet 问题【英文标题】:DoCmd.TransferSpreadsheet Issue 【发布时间】:2017-11-06 14:25:02 【问题描述】:

我在 Access 2013 中将查询导出到 Excel。这是我用于导出的语法

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryDataExport", strExportPath, True

数据按应有的方式传输,但查询中的字段之一标题为 Player #,导出到 Excel 时变为 Player .

如何在导出时保持# 完好无损?

【问题讨论】:

您要导出的查询对象中的字段名称是否用方括号括起来? @ChristopherD.- 是的,它是表格中的短文本类型,在查询中它被列为 [Player #] 试试 11 号帖子,这里是 AndrewKKWalker windowssecrets.com/forums/showthread.php/…。我相信问题是您在导出 support.office.com/en-us/article/… 中使用了保留符号 @user2676140 虽然您对问题的分析是正确的,但该解决方案不是(它创建一个 CSV 文件,而不是一个 xslx 文件)。如果要以这种方式导出为.xslx,则需要创建自定义导出函数。 是的,您可以使用记录集创建自定义导出功能。给我一点时间,我什至可以为你写一个。 【参考方案1】:

虽然DoCmd.TransferSpreadsheet 可以重现问题,但请考虑DoCmd.OutputTo,它保留了查询的格式。前一种方法可能更侧重于电子表格格式。

事实上,DoCmd.OutputTo 看起来是外部数据\Excel 导出功能区方法的自动化版本(选择保留所有格式):

DoCmd.OutputTo acOutputQuery, "qryDataExport", acFormatXLSX, strExportPath

【讨论】:

【参考方案2】:

您可以使用以下函数将内容导出到 .xlsx 文件,而不必处理 DoCmd.TransferSpreadsheet 的限制

Public Sub CustomExcelExport(QueryOrTableOrSQL As String, FileLocation As String)
    Dim rs As DAO.Recordset
    Dim excelApp As Object
    Set excelApp = CreateObject("Excel.Application")
    Set rs = CurrentDb.OpenRecordset(QueryOrTableOrSQL)
    excelApp.Workbooks.Add
    Dim colNo As Long: colNo = 1
    Dim rowNo As Long: rowNo = 1
    Dim fld As Variant

    For Each fld In rs.Fields
        excelApp.Cells(rowNo, colNo) = fld.Name
        colNo = colNo + 1
    Next fld
    Do While Not rs.EOF
       colNo = 1
       rowNo = rowNo + 1
       For Each fld In rs.Fields
            excelApp.Cells(rowNo, colNo) = fld.Value
            colNo = colNo + 1
       Next fld
       rs.MoveNext
    Loop
    excelApp.ActiveWorkbook.SaveAs FileLocation, 51 'xlOpenXMLWorkbook
    excelApp.Quit
End Sub

打电话给:CustomExcelExport "qryDataExport", strExportPath

【讨论】:

我刚刚将语法移到我的生产数据库中,它正在点击 Set rs = CurrentDb.OpenRecordset(QueryOrTableOrSQL) 行,然后离开该过程?所以实际上没有出口。 - 如果有差异,那就是 Excel 2013。 您的查询实际上是否返回行?如果您的查询返回 0 行和 0 个字段,就会发生这种情况。 它正在返回行 - 但似乎一个字段有错误,因为它要求我输入一个值。这会是罪魁祸首吗? 是的,这对参数化查询不起作用(DoCmd.TransferSpreadsheet 也不起作用)。您可以调整它以使用QueryDef 和参数,并使用ParamArray 将参数发送到查询,或者您可以修复您的查询。 是的 - 我删除了这些字段并且查询正在执行,现在上面的过程给了我运行时错误'13':类型不匹配

以上是关于DoCmd.TransferSpreadsheet 问题的主要内容,如果未能解决你的问题,请参考以下文章

将截断查询结果插入表中

从 excel 导入到具有更多字段的访问表 (vba)

从 Excel 数据更新 Access 表中的数据和关系

打开多个 Excel 实例时如何通过 Excel 宏将数据从 Excel 导出到 Access

MS Access 运行时错误 '3011 显示在一个代码中,但不在另一个代码中