首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从MS Access中将交叉表查询结果导出到Excel

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

Stack Overflow用户
提问于 2008-12-08 00:43:16
回答 4查看 11.5K关注 0票数 3

我一直在尝试使用Access 2003将交叉表查询结果集导出到Excel中,但只取得了有限的成功。有时,导出工作正常,Excel显示时没有错误。其他时候,使用完全相同的查询参数,我得到一个3190错误-字段太多。我在从VB代码调用的宏中使用TransferSpreadsheet选项。

宏具有以下参数:传输类型:导出电子表格类型: Microsoft Excel 8-10表名:(这是我的查询名)文件名:(目录中存在的Excel输出文件)具有字段名:是

查询生成的信息不应该超过14列,因此Excel 255列的限制应该不是问题。此外,数据库中的数据在查询期间不会更改,因此相同的查询将产生相同的结果集。

到目前为止,我在网上读到的唯一解决方案之一是在运行宏之前关闭记录集,但这是命中或失败的。

非常感谢您的想法/帮助!

EN

回答 4

Stack Overflow用户

发布于 2008-12-08 15:25:49

我已经有一个作为MS Access宏的工作。它通过以下方式使用OutputTo操作:

  • Object Type=Query
  • Object Name=WhateverQueryName
  • Output Format=MicrosoftExcel(*.xls)
  • Auto
  • (其余所有内容为空)

我讨厌在MS Access中使用Macros (感觉不干净),但也许可以试一试。

票数 2
EN

Stack Overflow用户

发布于 2009-03-06 13:32:03

如果您愿意使用一些vba,而不是只使用宏,下面的内容可能会对您有所帮助。此模块接受您抛出的任何sql,并将其导出到excel工作表中的定义位置。该模块后面是两个使用它的示例,一个用于创建一个全新的工作簿,另一个用于打开现有的工作簿。如果您对使用SQL没有信心,只需创建所需的查询,保存它,然后将"SELECT * FROM YourQueryName“作为QueryString参数提供给Sub。

代码语言:javascript
复制
Sub OutputQuery(ws As excel.Worksheet, CellRef As String, QueryString As String, Optional Transpose As Boolean = False)

    Dim q As New ADODB.Recordset
    Dim i, j As Integer

    i = 1

    q.Open QueryString, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly


    If Transpose Then
        For j = 0 To q.Fields.Count - 1
            ws.Range(CellRef).Offset(j, 0).Value = q(j).Name
            If InStr(1, q(j).Name, "Date") > 0 Or InStr(1, q(j).Name, "DOB") > 0 Then
                ws.Range(CellRef).Offset(j, 0).EntireRow.NumberFormat = "dd/mm/yyyy"
            End If
        Next

        Do Until q.EOF
            For j = 0 To q.Fields.Count - 1
                ws.Range(CellRef).Offset(j, i).Value = q(j)
            Next
            i = i + 1
            q.MoveNext
        Loop
    Else
        For j = 0 To q.Fields.Count - 1
            ws.Range(CellRef).Offset(0, j).Value = q(j).Name
            If InStr(1, q(j).Name, "Date") > 0 Or InStr(1, q(j).Name, "DOB") > 0 Then
                ws.Range(CellRef).Offset(0, j).EntireColumn.NumberFormat = "dd/mm/yyyy"
            End If
        Next

        Do Until q.EOF
            For j = 0 To q.Fields.Count - 1
                ws.Range(CellRef).Offset(i, j).Value = q(j)
            Next
            i = i + 1
            q.MoveNext
        Loop
    End If

    q.Close

End Sub

示例1:

代码语言:javascript
复制
Sub Example1()
    Dim ex As excel.Application
    Dim wb As excel.Workbook
    Dim ws As excel.Worksheet

    'Create workbook
    Set ex = CreateObject("Excel.Application")
    ex.Visible = True
    Set wb = ex.Workbooks.Add
    Set ws = wb.Sheets(1)

    OutputQuery ws, "A1", "Select * From [TestQuery]"
End Sub

示例2:

代码语言:javascript
复制
Sub Example2()
    Dim ex As excel.Application
    Dim wb As excel.Workbook
    Dim ws As excel.Worksheet

    'Create workbook
    Set ex = CreateObject("Excel.Application")
    ex.Visible = True
    Set wb = ex.Workbooks.Open("H:\Book1.xls")
    Set ws = wb.Sheets("DataSheet")

    OutputQuery ws, "E11", "Select * From [TestQuery]"
End Sub

希望这对你有用。

票数 1
EN

Stack Overflow用户

发布于 2008-12-10 15:35:51

一种解决方法是先将查询追加到表中,然后再将其导出。

代码语言:javascript
复制
DoCmd.SetWarnings False
 DoCmd.OpenQuery "TempTable-Make" 
 DoCmd.RunSQL "DROP TABLE TempTable" 
 ExportToExcel()
DoCmd.SetWarnings True

TempTable-Make是一个基于交叉表的make-table查询。

Here是一个可以使用的合适的ExportToExcel函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/348428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档