在VBA中以读/写模式从Access导出查询到Excel

时间:2015-03-05 21:29:42

标签: vba excel-vba ms-access access-vba excel

以下是从Access导出名为“LatestSNR”的查询的代码;

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

执行代码后,查询将转移到Excel工作表,并以“只读”模式查看。如果我尝试保存它,则会生成excel文件的副本。可以在读/写模式下打开Excel吗?以便保存工作簿,并将查询重复传输到同一工作簿。

1 个答案:

答案 0 :(得分:0)

通常,导出的Excel文件不应处于只读模式。在处理过程中的某个地方,您无法正确结束Excel实例。检查的一个好方法是在进程下的任务管理器中查看EXCEL.EXE是否仍然存在。如果是,请结束该过程并进行以下代码调整:

首先,正确关闭并保存您的Excel文件。 Quit需要保存或不保存工作簿的确认,因为它意味着关闭您初始化的Excel应用程序,而不是目标工作簿。所以在Apxl.Quit之前添加:

xlWBk.Close True

其次,正确地取消初始化Excel对象以释放计算机资源。这不是必需的,只是良好的编码实践:

Set Apxl = Nothing
Set xlWBk = Nothing
Set xlWSh = Nothing

顺便说一句,除非你进行细致入微的编码和格式化,否则会有一个内置的Access to Excel功能,可以将字段名称和记录集一起导出:DoCmd.TransferSpreadsheet