1

用户在表单中动态生成查询,结果显示在同一表单的列表框中。列表框可以有 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
4

3 回答 3

1

您可以使用与列表框的行源相同的外部数据源在 excel 中创建一个 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

在我关闭 Access 中的表单之前,我无法刷新 Excel 中的列表。因此,您可能需要处理一些权限问题。

于 2013-07-10T19:10:38.260 回答
0

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

PS关于第一种方法。为避免用户点击,您可以隐藏 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
于 2013-07-10T16:03:14.480 回答
0

请参阅本网站以了解所有可能的方法以及它们的优点/缺点。对于您的问题,我更喜欢使用 DAO 方法。示例代码也在此站点中。

将数据从访问权限传输到excel的方法

当您逐个单元格导入时,您可以根据需要格式化任何行、列、单元格。例如:

 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
于 2013-07-11T02:32:50.900 回答