用户在表单中动态生成查询,结果显示在同一表单的列表框中。列表框可以包含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
答案 0 :(得分:1)
您可以在excel中创建一个ListObject,其外部数据源与Listbox的RowSource相同。
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
在我关闭Access中的表单之前,我无法刷新Excel中的列表。因此,您可能需要处理一些权限问题。
答案 1 :(得分:0)
尝试生成XML文件。这是一个例子:http://blogs.msdn.com/b/brian_jones/archive/2005/06/27/433152.aspx
P.S。关于第一种方法。 为避免用户点击,您可以隐藏Excel。 您也可以加速Excel(参见下面的功能)。在放置数据之前使用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
答案 2 :(得分:0)
请参阅本网站了解所有可能的方法以及它们的优缺点。 对于您的问题,我更喜欢使用DAO方法。示例代码也在此站点中。
Way to transer data from access to excel
在按单元格导入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