用户在表单中动态生成查询,结果显示在同一表单的列表框中。列表框可以有 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"
该方法涉及将动态生成的查询保存到单击时保存的查询中。
这样做的问题是列没有被格式化,并且 excel 将所有内容读取为字符串而不是数据类型,而在第一种方法中,数据类型被正确读取。
有什么方法可以缓解这些问题,还是有更有效的方法来做到这一点?
解决方案(当前格式为字符串)
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