0

I am using ADO to query a table in MS Access 2003, and outputting the data to Excel 2003 worksheets using the CopyFromRecordset method.

The table has more than 65536 records, so I cannot use DoCmd.TransferSpreadsheet and need to use VBA with ADO.

My problem is that after making a call to CopyFromRecordset even though only 65536 records are output, the cursor stays at 1 (AbsolutePosition=1) when according to my understanding, the cursor should be at 65537, ready for the next call to CopyFromRecordset

Here below is the code I am using:

Dim oXL As Excel.Application
Dim adoConn As ADODB.Connection
Dim adoRS As ADODB.Recordset
Dim iIndx As Integer

Dim blnMultipleSheets As Boolean

Set adoConn = New ADODB.Connection
Set adoRS = New ADODB.Recordset

With adoConn
    .CursorLocation = adUseClient
    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=O:\Dev\Support\Recurring_Requests\Future_Deals_Notice_InterestValues_Rates_Data\Future Deals.mdb;Persist Security Info=False"
    .Open
End With

With adoRS
    .CursorType = adOpenForwardOnly
    .ActiveConnection = adoConn
    .CursorLocation = adUseClient
    .Source = "SELECT * FROM Future_Deals_InterestValues_Rates_Data"
    .Open
End With

Set oXL = New Excel.Application

With oXL
    If .Version < 12 Then
        blnMultipleSheets = True
    Else
        blnMultipleSheets = False
    End If

    .Visible = True
    .Workbooks.Add

    .Range("B2").CopyFromRecordset adoRS
    If adoRS.RecordCount > .ActiveSheet.Rows.Count Then
        Do While Not adoRS.EOF
            .Sheets.Add
            Range("B2").CopyFromRecordset adoRS
        Loop
    End If
End With

so what am I missing here?

4

2 回答 2

1

这是我用的:

Dim iRow, iColumn, iSheet As Integer

iSheet = 1
iRow= 1

With oLibrExce
        .Visible = True
        .Workbooks.Add

    While Not record.EOF
        .Worksheets.Add
        Set oHojaExce = .ActiveWorkbook
        With oHojaExce.Worksheets(1)
            .Activate
            .Name = tableName & iSheet 
            For iColumn = 0 To cantidadColumnas - 1
                .cells(1, iColumn + 1) = Columnas(iColumn)
                .cells(1, iColumn + 1).Font.Bold = True
                If TipoColumnas(iColumn) = "DATE" Then
                    .Columns(iColumn + 1).Select
                    .Columns(iColumn + 1).NumberFormat = "m/d/yyyy"
                End If
                If TipoColumnas(iColumn) = "NUMBER" Then
                    .Columns(iColumn + 1).Select
                    .Columns(iColumn + 1).NumberFormat = "0.00"
                End If
            Next
            .range("A2").copyfromrecordset record, 1048576
            iSheet = iSheet + 1
        End With
        .cells.EntireColumn.AutoFit
        .cells(1, 1).Select
    Wend
End With
于 2013-10-28T14:43:50.807 回答
0

这条线

.Range("B2").CopyFromRecordset adoRS

粘贴整个记录集,将其放置在 B2 作为左上角坐标。

所以,删除你的循环和上面的行。

您可以像这样循环记录集(伪代码):

Function pasteRecordSet(ByRef adoRS)
    For i = 1 To adoRS.RecordCount
        If i > 65536 Then
            new sheet
            + you can call here recursively
        Else ' on the current sheet
            adoRS.MoveNext
            If (adoRS.EOF) Then
                adoRS.MoveFirst
            End If
    Next i
End Function
于 2013-05-28T14:14:35.733 回答