对于我的第一个查询,我使用
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 文件表并将数据显示在 E6600 (2,40 Ghz)、4GB ram 机器上大约需要 10 秒,带有 access/excel 2010。
编辑:
实现相同目的的另一种方法是使用 TransferSpreadsheet 2 次。
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryNameFirst", "test1.xlsx", True, "MyWorksheetName"
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qryNameSecond", "test1.xlsx", True, "MyWorksheetName2"
这将在工作簿中创建 2 个工作表,然后只需将一个工作表的数据复制到另一个工作表。我认为性能会相同但不确定,我会坚持使用 OpenRecordSet。