我一直在努力尝试使用Access 2003将交叉表查询结果集导出到Excel。有时,导出工作正常,Excel显示没有错误。其他时候,使用完全相同的查询参数,我得到3190错误 - 字段太多。我在从VB代码调用的宏中使用TransferSpreadsheet选项。
宏具有以下参数: 转移类型:出口 电子表格类型:Microsoft Excel 8-10 表名:(这是我的查询名称) 文件名:( Excel输出文件,存在于目录中) 有字段名称:是
查询不应产生超过14列的信息,因此Excel 255 col限制应该不是问题。此外,在我查询期间,数据库中的数据不会更改,因此相同的查询将生成相同的结果集。
到目前为止,我在网上阅读的唯一解决方案之一是在运行宏之前关闭记录集,但这是命中或遗漏。
非常感谢您的想法/帮助!
答案 0 :(得分:2)
我有一个工作作为MS Access宏。 它使用OutputTo Action:
我讨厌在MS Access中使用宏(感觉不干净),但也许试一试。
答案 1 :(得分:1)
如果您愿意使用一点vba而不是专门使用宏,以下内容可能会对您有所帮助。此模块接受您抛出的任何sql并将其导出到Excel工作表中的已定义位置。在模块是它的两个使用示例之后,一个用于创建一个全新的工作簿,一个用于打开现有工作簿。如果您对使用SQL没有信心,只需创建所需的查询,保存它,然后将“SELECT * FROM [YourQueryName]”作为QueryString参数提供给Sub。
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:
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:
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
希望对你有用。
答案 2 :(得分:0)
解决方法是先将查询附加到表中,然后将其导出。
DoCmd.SetWarnings False
DoCmd.OpenQuery "TempTable-Make"
DoCmd.RunSQL "DROP TABLE TempTable"
ExportToExcel()
DoCmd.SetWarnings True
TempTable-Make是基于交叉表的生成表查询。
Here是您可以使用的适当的ExportToExcel函数。
答案 3 :(得分:0)
以下代码使用专门用于导入记录集CopyFromRecordset
的excel函数导出查询。请注意,需要添加字段名称,因为此功能仅获取实际数据。该代码甚至适用于交叉表查询。
'---------------------------------------------------------------------------------------
' Method : MoveQueryToWorksheet
' Author : ROLU
' Date : 09.05.2018
' Purpose: Moves queries to specific worksheet in an Excel Workbook
'---------------------------------------------------------------------------------------
Function MoveQueryToWorksheet(wkb As Excel.Workbook, wks As Variant, strSQL As Variant) As Boolean
On Error GoTo MoveQueryToWorksheet_Error
'Dim rs As New ADODB.Recordset
'rs.Open strSQL, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly
Dim dbs As DAO.Database
Set dbs = CurrentDb
Dim rs
Set rs = dbs.OpenRecordset(strSQL)
Dim lCol As Long
For lCol = 0 To rs.Fields.Count - 1
wkb.Worksheets(wks).Cells(1, lCol + 1).Value = rs.Fields(lCol).Name
Next lCol
wkb.Worksheets(wks).Range("A2").CopyFromRecordset rs
'Close out and clean
Set rs = Nothing
MoveQueryToWorksheet = True
Exit Function
MoveQueryToWorksheet_Error:
On Error GoTo 0
Set rs = Nothing
MoveQueryToWorksheet = False
End Function