最有效的方法导出Access 2003列表框RowSource(查询)到Excel 2003

用户dynamic地在一个表单中生成查询,结果显示在同一个表单的列表框中。 列表框可以有1到12列的任何地方。

用户希望此查询的结果能够导出到Excel。 我相信不保存文件是首选,但任何工作将起作用。

我目前发现了两种方法,每种都有自己的问题

1

myExApp.visible = True myExApp.Workbooks.Add Set myExSheet = myExApp.Workbooks(1).Worksheets(1) If myExApp.Ready = True Then For i = 1 To Me!listDynamicSearchResult.ColumnCount Me!listDynamicSearchResult.BoundColumn = Me!listDynamicSearchResult.BoundColumn + 1 For j = 1 To Me!listDynamicSearchResult.ListCount myExSheet.Cells(j, i) = Me!listDynamicSearchResult.ItemData(j - 1) Next j Next i Me!listDynamicSearchResult.BoundColumn = 0 End If 

哪些工作正常,但由于显而易见的原因,成为指数缓慢。

当用户在现在打开的Excel表单中单击时,该方法也会导致错误。

再加上它的速度有多慢,用户很可能会导致错误,试图在循环完成之前操作表单。

2

DoCmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel9,“test”,“I:\ test.xls”

该方法涉及将点击dynamic保存的查询dynamic保存到保存的查询中。

问题是这些列没有被格式化,而excel以string而不是数据types读取所有内容,而在第一种方法中,数据types被正确读取。

有什么办法可以缓解这个问题,还是有更有效的方法来做到这一点?

解决scheme (目前格式为string)

 Set xlApp = New Excel.Application Set xlWb = xlApp.Workbooks.Add Set xlWs = xlWb.Worksheets(1) xlApp.visible = True strFile = CurrentProject.FullName strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strFile & ";" Set cn = CurrentProject.AccessConnection Set rs = CreateObject("ADODB.recordset") With rs Set .ActiveConnection = cn .Source = Me!listDynamicSearchResult.RowSource .Open End With With xlWs .QueryTables.Add Connection:=rs, Destination:=.Range("A1") .QueryTables(1).Refresh End With 

您可以使用与列表框的行来源相同的外部数据源在Excel中创build一个ListObject。

 Private Sub Command2_Click() Dim xlApp As Excel.Application Dim xlWb As Excel.Workbook Dim xlWs As Excel.Worksheet Dim xlLo As Excel.ListObject Set xlApp = GetObject(, "Excel.Application") Set xlWb = xlApp.Workbooks.Add Set xlWs = xlWb.Worksheets(1) Set xlLo = xlWs.ListObjects.Add(xlSrcExternal, "OLEDB;" & CurrentProject.Connection, , xlYes, xlWs.Range("A3")) xlLo.QueryTable.CommandType = xlCmdSql xlLo.QueryTable.CommandText = Me.listDynamicSearchResult.RowSource DoCmd.Close acForm, Me.Name End Sub 

我无法刷新Excel中的列表,直到我closuresAccess中的窗体。 所以你可能有一些权限问题来处理。

尝试生成一个XML文件。 这里是一个例子: http : //blogs.msdn.com/b/brian_jones/archive/2005/06/27/433152.aspx

PS关于第一种方法。 为了避免用户点击,您可以隐藏Excel。 你也可以加快Excel(见下面的function)。 在放置数据之前使用Prepare(),在它之后使用Ended()或者在发生错误时使用。

 Public Sub Prepare() Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False ActiveSheet.DisplayPageBreaks = False Application.DisplayStatusBar = False Application.DisplayAlerts = False End Sub Public Sub Ended() Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True ActiveSheet.DisplayPageBreaks = True Application.DisplayStatusBar = True Application.DisplayAlerts = True End Sub 

请参阅本网站所有可能的方法以及它们的优缺点。 对于你的问题,我宁愿使用DAO方法。 示例代码也在这个网站。

将数据从访问转移到excel的方式

在导入Cell by Cell时,可以根据需要格式化任何Row,Column,Cell。 例如:

  xlActiveSheet.Cells(4,5).Characters(2).Font.ColorIndex = 5 

要么

 xlActiveSheet.Columns("A:AZ").EntireColumn.AutoFit 

要么

 xlActiveSheet.Range(xlActiveSheet.Cells(1, 1), xlActiveSheet.Cells(1, rec1.Fields.count)).Interior.ColorIndex = 15