在 VBA 中以 Read/Write 模式将查询从 Access 导出到 Excel
To export query from Access to Excel in Read/Write mode in VBA
下面是将名为 'LatestSNR' 的查询从 Access 导出到 Excel;
的代码
Public Sub Expdata()
Dim rst As DAO.Recordset
Dim Apxl As Object
Dim xlWBk, xlWSh As Object
Dim PathEx As String
Dim fld As DAO.Field
PathEx = Forms("Export").Text14 'path comes from the directory given in form
Set Apxl = CreateObject("Excel.Application")
Set rst = CurrentDb.OpenRecordset("LatestSNR")
Set xlWBk = Apxl.Workbooks.Open(PathEx)
'xlWBk.ChangeFileAccess xlReadWrite
Set xlWBk = Workbook("PathEx")
Apxl.Visible = True
Set xlWSh = xlWBk.Worksheets("Metadatasheet")
xlWSh.Activate
xlWSh.Range("A2").Select
For Each fld In rst.Fields
Apxl.ActiveCell = fld.Name
Apxl.ActiveCell.Offset(0, 1).Select
Next
rst.MoveFirst
xlWSh.Range("A2").CopyFromRecordset rst
xlWSh.Range("1:1").Select
' selects all of the cells
Apxl.ActiveSheet.Cells.Select
' selects the first cell to unselect all cells
xlWSh.Range("A2").Select
rst.Close
Set rst = Nothing
' Quit excel
Apxl.Quit
End Sub
代码执行后查询转为excelsheet,以'Read only'方式查看。如果我尝试保存它,则会生成 excel 文件的副本。 Excel 可以在 Read/Write 模式下打开吗?以便保存工作簿并重复将查询传输到同一工作簿。
通常,您导出的 Excel 文件不应处于只读模式。在您处理的某个地方,您没有正确结束 Excel 实例。检查的一个好方法是在进程下的任务管理器中查看 EXCEL.EXE 是否仍然存在。如果是,结束进程并做如下代码调整:
首先,正确关闭并保存您的 Excel 文件。 Quit 需要保存或不保存工作簿确认,因为这意味着关闭您初始化的 Excel 应用程序,而不是目标工作簿。所以在Apxl.Quit
之前加上:
xlWBk.Close True
其次,正确取消初始化您的 Excel 对象以释放计算机资源。这不是必需的,只是良好的编码习惯:
Set Apxl = Nothing
Set xlWBk = Nothing
Set xlWSh = Nothing
顺便说一下,除非您进行细微的编码和格式化,否则有一个内置的访问 Excel 函数可以将字段名称和记录集一起导出:DoCmd.TransferSpreadsheet.
下面是将名为 'LatestSNR' 的查询从 Access 导出到 Excel;
的代码Public Sub Expdata()
Dim rst As DAO.Recordset
Dim Apxl As Object
Dim xlWBk, xlWSh As Object
Dim PathEx As String
Dim fld As DAO.Field
PathEx = Forms("Export").Text14 'path comes from the directory given in form
Set Apxl = CreateObject("Excel.Application")
Set rst = CurrentDb.OpenRecordset("LatestSNR")
Set xlWBk = Apxl.Workbooks.Open(PathEx)
'xlWBk.ChangeFileAccess xlReadWrite
Set xlWBk = Workbook("PathEx")
Apxl.Visible = True
Set xlWSh = xlWBk.Worksheets("Metadatasheet")
xlWSh.Activate
xlWSh.Range("A2").Select
For Each fld In rst.Fields
Apxl.ActiveCell = fld.Name
Apxl.ActiveCell.Offset(0, 1).Select
Next
rst.MoveFirst
xlWSh.Range("A2").CopyFromRecordset rst
xlWSh.Range("1:1").Select
' selects all of the cells
Apxl.ActiveSheet.Cells.Select
' selects the first cell to unselect all cells
xlWSh.Range("A2").Select
rst.Close
Set rst = Nothing
' Quit excel
Apxl.Quit
End Sub
代码执行后查询转为excelsheet,以'Read only'方式查看。如果我尝试保存它,则会生成 excel 文件的副本。 Excel 可以在 Read/Write 模式下打开吗?以便保存工作簿并重复将查询传输到同一工作簿。
通常,您导出的 Excel 文件不应处于只读模式。在您处理的某个地方,您没有正确结束 Excel 实例。检查的一个好方法是在进程下的任务管理器中查看 EXCEL.EXE 是否仍然存在。如果是,结束进程并做如下代码调整:
首先,正确关闭并保存您的 Excel 文件。 Quit 需要保存或不保存工作簿确认,因为这意味着关闭您初始化的 Excel 应用程序,而不是目标工作簿。所以在Apxl.Quit
之前加上:
xlWBk.Close True
其次,正确取消初始化您的 Excel 对象以释放计算机资源。这不是必需的,只是良好的编码习惯:
Set Apxl = Nothing
Set xlWBk = Nothing
Set xlWSh = Nothing
顺便说一下,除非您进行细微的编码和格式化,否则有一个内置的访问 Excel 函数可以将字段名称和记录集一起导出:DoCmd.TransferSpreadsheet.