【问题标题】:Automating query export to Excel from Access with linked tables to SQL Server 2008 R2使用链接表将查询从 Access 自动导出到 Excel 到 SQL Server 2008 R2
【发布时间】:2016-03-31 19:01:29
【问题描述】:

我正在尝试自动将查询结果从 Access 2010 导出到 Excel 2010。这并不容易,因为 Access 使用的是链接表 (SQL Server 2008 R2)。我知道这可以手动完成,但我真的很想自动化这个过程。

当我尝试单步执行位于 Access 中的以下 VBA 代码时,我到达了这一行,然后它一直在运行,永远不会超过这一点

Set wbTarget = XL.Workbooks.Open("H:\TATData\Test.xlsx")

(没有错误信息)

在将查询复制到 VBA 编辑器之前,我已经对其进行了测试,因此我知道查询可以正常工作,而且速度非常快,但不是自动化的。我还在需要的 Access 中设置了 MS Excel 库。

请帮助弄清楚需要做什么才能使其正常工作。 我必须杀死 Access 才能让它停止运行。

这是我的代码:

    Public Sub ExportToExcel()

'Step 1: Declare your variables

Dim XL As Excel.Application
Dim excelApp    As Object

Dim wbTarget As Workbook
Dim sht As Worksheet

Dim qdfTestData As QueryDef


Dim rsTestData As Recordset

Dim strSQL As String

Dim i As Integer


strSQL = "SELECT dbo_Patient.firstnm, dbo_Patient.lastnm, dbo_Sample.SampleDt, dbo_Test.TestTypeCd "
strSQL = strSQL & "FROM (dbo_Patient INNER JOIN dbo_Sample ON dbo_Patient.PatientId = dbo_Sample.PatientId) INNER JOIN dbo_Test ON dbo_Sample.SampleID = dbo_Test.SampleId "
strSQL = strSQL & "WHERE (((dbo_Test.TestTypeCd)='FL_XM_ALLO'));"


'set up reference to the query to export
    CurrentDb.QueryDefs.Delete ("qrTest")

'set up reference to the query to export

Set qdfTestData = CurrentDb.CreateQueryDef("qrTest", strSQL)

'Execute the query
Set rsTestData = qdfTestData.OpenRecordset()


'Create a new Excel instance.
    Set excelApp = CreateObject("Excel.Application")
'Set reference to the export workbook
'Set wbTarget = XL.Workbooks.Open("H:\TATData\Test.xlsx")
Set wbTarget = excelApp.Workbooks.Add
Set sht = wbTarget.Worksheets("Sheet1")
'clear excel sheet
On Error GoTo 0

    excelApp.Visible = True

On Error GoTo Errorhandler

wbTarget.Worksheets("Sheet1").Cells.ClearContents
'Use paste from recordset to put in excel sheet
wbTarget.Worksheets("Sheet1").Cells(2, 1).CopyFromRecordset rsTestData
'clear excel sheet

Errorhandler:
    DoCmd.SetWarnings True
    MsgBox Err.Description, vbExclamation, Err.Number
    Exit Sub
'wbTarget.Save
End Sub

【问题讨论】:

  • 请参阅上面的更新代码。我现在收到错误“430”类不支持自动化。有没有希望让它发挥作用?谢谢
  • 它转到错误处理程序,所以可能是excelApp.Visible = True..如果我删除错误处理程序,它会在 wbTarget.Worksheets("Sheet1").Cells(2, 1).CopyFromRecordset rsTestData 停止并显示错误 430 消息。
  • 是的,它确实可以打开它......它只是不复制数据。
  • 我怀疑您能否将在 Access 中创建的记录集传递给 Excel 方法 CopyFromRecordset。您不必通过XL 对象创建记录集吗?

标签: ms-access sql-server-2008-r2 vba


【解决方案1】:

您正在以比必要的方式更困难的方式执行此操作。要直接导出您的查询qrTest,请使用

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qrTest", _
    "H:\TATData\Test.xlsx", True

(这将创建一个未格式化的工作表)

DoCmd.OutputTo acOutputQuery, "qrTest", acFormatXLSX, "H:\TATData\Test.xlsx", False

(这将创建一个格式化的工作表)


旁注:如果

Set wbTarget = XL.Workbooks.Open("H:\TATData\Test.xlsx")

不起作用,这不是由您的查询或 Access 中的任何内容引起的。此文件本身是否有任何 ODBC 连接?

【讨论】:

  • 是否每次都需要删除重建查询? ..Excel 文件未连接。我需要连接它才能完成这项工作吗?您知道导致自动化错误“430”的原因吗?非常感谢您的帮助!
  • 'DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "qrTest", _ "H:\TATData\Test.xlsx", True` 此代码是否应该在常规 Access 模块中?请说明将代码放在哪里以及如何调用它。谢谢
  • @user3781528:没关系。如果您的 SQL SELECT 是静态的,您还可以将其保存为“常规”查询(可能名称比 qrTest 更好),然后导出该查询。
  • @user3781528:您设置了 SELECT 查询,无论是静态的还是动态的,就像现在一样。然后你做DoCmd.TransferSpreadsheet。您的所有 Excel 代码都可以删除。
  • 大声笑......我不敢相信它是多么容易......它工作......非常感谢你
猜你喜欢
  • 2013-09-01
  • 2016-05-18
  • 1970-01-01
  • 2015-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-21
  • 1970-01-01
相关资源
最近更新 更多