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