2015-04-23 118 views
2

我有一个宏(使用宏向导创建),它运行多个查询,然后输出一个Excel表。该表格具有超过65,000个记录限制,用于导出格式化表格。如何导出表格而无需在宏中格式化?这是我运行宏后收到的错误。用于导出到Excel的MS Access宏访问限制为65k条记录

enter image description here

+1

请尝试使用'DoCmd.TransferSpreadsheet'。 – PaulFrancis

+0

工作,但似乎偶尔崩溃的数据库。这似乎是不可靠的? –

+1

你要导出什么类型的Excel文件? .xls只能有65,535行。也许.xslx可以做到这一点,因为它可以容纳更多的行(如果你还没有做到这一点)。甚至可以尝试使用.xlsb来提高性能,因为它可以减小文件大小并且速度更快。 – Makki

回答

0

我知道你正在使用VBA访问导出的记录,但你有没有想过使用数据链路从Excel您的查询,使用访问VBA打开Excel文件并刷新数据表?这肯定会消除最大行数的问题,并且不应该由于导出大小而导致任何故障问题。如果您需要更多关于如何做的信息,请告诉我,我会在此处添加更多信息。

0

这是上面的Anthony Griggs要求的代码。但它是一个VBA解决方案,而不是一个宏观解决方案,因此不能直接响应所发布的问题。这就是我为解决这个问题而努力的方式,并且长期以来在生产中取得了成功。

在使用此代码之前,一定要添加对“Microsoft ActiveX Data Objects 2.8 Library”(或当前版本)以及“Microsoft Excel 12.0 Object Library”(或当前版本)的引用。保存更改并在最后退出至关重要,否则它会让Excel在后台打开,您必须通过任务管理器来终止。

Dim rs As New ADODB.Recordset 

    Dim xl As New Excel.Application 
    Dim xlWb As Excel.Workbook 
    Dim xlRange As Excel.Range 

    xl.Visible = False 
    xl.ScreenUpdating = False 

    vcurfilename = "MyFilename.XLSX” 

    Set xlWb = xl.Workbooks.Open(vcurfilename, 0, False, 5, "password", "password") 

    rs.Open "Select * from qryMyAccessQuery", CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly 
    Set xlRange = xlWb.Worksheets("MyExcelSheetName").Range("A1").Offset(1, 0) 
    xlWb.Sheets("MyExcelSheetName ").Range("a2:bq25000").ClearContents 
    xlRange.Cells.CopyFromRecordset rs 

    xl.Range("Table1").Sort key1:=xl.Range("Table1[[#All],[MyColumnName]]"), _ 
    order1:=xlAscending, Header:=xlYes 

    On Error Resume Next 
    xl.Range("table1").Columns("A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 
    On Error GoTo 0 
    rs.Close 

    xl.Range("table1").ListObject.HeaderRowRange.Find("MyColumnName1").EntireColumn.NumberFormat = "dd-MMM-yy" 
    xl.Range("table1").ListObject.HeaderRowRange.Find("MyColumnName2").EntireColumn.NumberFormat = "dd-MMM-yy" 
    xl.Range("table1").ListObject.HeaderRowRange.Find("MyColumnName3").EntireColumn.NumberFormat = "dd-MMM-yy" 

    xlWb.Close SaveChanges:=True 
    xl.Quit 
    DoEvents