如何从excel中导出2个查询到excel中的单个工作表

时间:2012-08-10 18:30:02

标签: excel ms-access export-to-excel recordset

我正在使用TransferSpreadsheet从访问excel导出查询,它可以正常工作。

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, "qryName", "test1.xls", True

现在我有另一个查询,我想将此查询中的数据添加到同一工作表中。我怎么能这样做?

1 个答案:

答案 0 :(得分:4)

对于我的第一个查询,我使用

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryNameFirst", "test1.xlsx", True, "MyWorksheetName"

对于第二个查询,我把它放在记录集中

Dim rstName As Recordset
Set rstName = CurrentDb.OpenRecordset("qryNameSecond")

然后我只使用CopyFromRecordset将此记录集复制到工作表中。

Dim objApp As Object, objMyWorkbook As Object, objMySheet As Object, objMyRange As Object

Set objApp = CreateObject("Excel.Application")
Set objMyWorkbook = objApp.Workbooks.Open("test1.xlsx")
Set objMySheet = objMyWorkbook.Worksheets("MyWorksheetName")
Set objMyRange = objMySheet.Cells(objApp.ActiveSheet.UsedRange.Rows.Count + 2, 1)

With objMyRange
 rstName.MoveFirst 'Rewind to the first record
 .Clear
 .CopyFromRecordset rstName
End With

objApp.ActiveSheet.UsedRange.Rows.Count将返回上次使用的行号。我添加了+ 2,因为我希望两个查询之间有一个空行。

要添加我做了一次性能测试。我用500.000条记录测试了这种方法。该表包含500k行,第一个查询包含250k行,第二个查询(包含OpenRecordSet)包含250k行。生成excel文件表大约需要10秒钟,并在具有access / excel 2010的E6600(2,40 Ghz),4GB ram机器上显示数据。

编辑:

实现相同目标的另一种方法是使用TransferSpreadsheet 2次。

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryNameFirst", "test1.xlsx", True, "MyWorksheetName"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryNameSecond", "test1.xlsx", True, "MyWorksheetName2"

这将在工作簿中创建2个表单,然后只将一个工作表的数据复制到另一个工作表。我认为性能会相同但不确定,我会坚持使用OpenRecordSet。