DetailPage-MSS-KB

Microsoft Knowledge Base

Identificativo articolo: 246335 - Ultima modifica: mercoledì 28 marzo 2007 - Revisione: 5.1

 

In questa pagina

Sommario

È possibile trasferire il contenuto di un recordset ADO a un foglio di lavoro di Microsoft Excel per l'automazione di Excel. L'approccio che è possibile utilizzare dipende dalla versione di Excel che si desidera automatizzare. Excel 97, Excel 2000 ed Excel 2002 dispone di un metodo CopyFromRecordset che è possibile utilizzare per trasferire un recordset in un intervallo. CopyFromRecordset in Excel 2000 e 2002 può essere utilizzato per copiare un DAO o di un recordset ADO. Tuttavia, CopyFromRecordset in Excel 97 supporta solo i recordset DAO. Per trasferire un recordset ADO a Excel 97, è possibile creare una matrice dal recordset e quindi popolare un intervallo con il contenuto della matrice.

In questo articolo viene descritto entrambi gli approcci. Il codice di esempio presentato illustra come è possibile trasferire un recordset ADO a Excel 97, Excel 2000, Excel 2002, Excel 2003 o Excel 2007.

Informazioni

Nell'esempio di codice riportato di seguito viene illustrato come copiare un oggetto ADO recordset in un foglio di lavoro Microsoft Excel utilizzando l'automazione da Visual Basic. Il codice controlla innanzitutto la versione di Excel. Se viene rilevato Excel 2000 o 2002, il metodo CopyFromRecordset viene utilizzato poiché è efficiente e richiede meno codice. Tuttavia, se viene rilevato Excel 97 o versioni precedenti, il recordset viene prima copiato in una matrice utilizzando il metodo GetRows dell'oggetto ADO recordset, La matrice viene quindi trasposto in modo che i record sono nella prima dimensione (in righe) e i campi sono nella seconda dimensione (in colonne). Quindi, la matrice viene copiata in un foglio di lavoro assegnando la matrice a un intervallo di celle di Excel. (La matrice è copiato in un passaggio anziché ciclo da una cella nel foglio di lavoro.)

L'esempio di codice utilizza il database di esempio Northwind incluso in Microsoft Office. Se è stata selezionata la cartella predefinita durante l'installazione di Microsoft Office, il database si trova:

\Program Files\Microsoft Office\Office\Samples\Northwind.mdb

Se Northwind database si trova in un'altra cartella del computer, è necessario modificare il percorso del database nel codice fornito di seguito.

Se non si dispone del database Northwind installato nel sistema, è possibile utilizzare l'opzione di installazione per l'installazione di Microsoft Office per installare i database di esempio.

Nota Il database Northwind non è installato quando si installa Microsoft Office 2007. Per ottenere Northwind 2007, il seguente sito Microsoft Web:
http://office.microsoft.com/en-us/templates/TC012289971033.aspx (http://office.microsoft.com/en-us/templates/TC012289971033.aspx)

Procedura per la creazione esempio

  1. Avviare Visual Basic e creare un nuovo progetto EXE standard,. In base all'impostazione predefinita, viene creato il progetto Form1.
  2. Aggiungere un pulsante di comando a Form1.
  3. Scegliere riferimenti dal menu progetto . Aggiungere un riferimento alla Libreria Microsoft ActiveX Data Objects 2.1 .
  4. Incollare il codice seguente nella sezione di codice di Form1:
    Private Sub Command1_Click()
        Dim cnt As New ADODB.Connection
        Dim rst As New ADODB.Recordset
        
        Dim xlApp As Object
        Dim xlWb As Object
        Dim xlWs As Object
    
        
        Dim recArray As Variant
        
        Dim strDB As String
        Dim fldCount As Integer
        Dim recCount As Long
        Dim iCol As Integer
        Dim iRow As Integer
        
        ' Set the string to the path of your Northwind database
        strDB ="c:\program files\Microsoft office\office11\samples\Northwind.mdb"
      
        ' Open connection to the database
        cnt.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=" & strDB & ";"
        
        ''When using the Access 2007 Northwind database
        ''comment the previous code and uncomment the following code.
        'cnt.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        '    "Data Source=" & strDB & ";"
            
        ' Open recordset based on Orders table
        rst.Open "Select * From Orders", cnt
        
        ' Create an instance of Excel and add a workbook
        Set xlApp = CreateObject("Excel.Application")
        Set xlWb = xlApp.Workbooks.Add
        Set xlWs = xlWb.Worksheets("Sheet1")
      
        ' Display Excel and give user control of Excel's lifetime
        xlApp.Visible = True
        xlApp.UserControl = True
        
        ' Copy field names to the first row of the worksheet
        fldCount = rst.Fields.Count
        For iCol = 1 To fldCount
            xlWs.Cells(1, iCol).Value = rst.Fields(iCol - 1).Name
        Next
            
        ' Check version of Excel
        If Val(Mid(xlApp.Version, 1, InStr(1, xlApp.Version, ".") - 1)) > 8 Then
            'EXCEL 2000,2002,2003, or 2007: Use CopyFromRecordset
             
            ' Copy the recordset to the worksheet, starting in cell A2
            xlWs.Cells(2, 1).CopyFromRecordset rst
            'Note: CopyFromRecordset will fail if the recordset
            'contains an OLE object field or array data such
            'as hierarchical recordsets
            
        Else
            'EXCEL 97 or earlier: Use GetRows then copy array to Excel
        
            ' Copy recordset to an array
            recArray = rst.GetRows
            'Note: GetRows returns a 0-based array where the first
            'dimension contains fields and the second dimension
            'contains records. We will transpose this array so that
            'the first dimension contains records, allowing the
            'data to appears properly when copied to Excel
            
            ' Determine number of records
    
            recCount = UBound(recArray, 2) + 1 '+ 1 since 0-based array
            
    
            ' Check the array for contents that are not valid when
            ' copying the array to an Excel worksheet
            For iCol = 0 To fldCount - 1
                For iRow = 0 To recCount - 1
                    ' Take care of Date fields
                    If IsDate(recArray(iCol, iRow)) Then
                        recArray(iCol, iRow) = Format(recArray(iCol, iRow))
                    ' Take care of OLE object fields or array fields
                    ElseIf IsArray(recArray(iCol, iRow)) Then
                        recArray(iCol, iRow) = "Array Field"
                    End If
                Next iRow 'next record
            Next iCol 'next field
                
            ' Transpose and Copy the array to the worksheet,
            ' starting in cell A2
            xlWs.Cells(2, 1).Resize(recCount, fldCount).Value = _
                TransposeDim(recArray)
        End If
    
        ' Auto-fit the column widths and row heights
        xlApp.Selection.CurrentRegion.Columns.AutoFit
        xlApp.Selection.CurrentRegion.Rows.AutoFit
    
        ' Close ADO objects
        rst.Close
        cnt.Close
        Set rst = Nothing
        Set cnt = Nothing
        
        ' Release Excel references
        Set xlWs = Nothing
        Set xlWb = Nothing
    
        Set xlApp = Nothing
    
    End Sub
    
    
    Function TransposeDim(v As Variant) As Variant
    ' Custom Function to Transpose a 0-based array (v)
        
        Dim X As Long, Y As Long, Xupper As Long, Yupper As Long
        Dim tempArray As Variant
        
        Xupper = UBound(v, 2)
        Yupper = UBound(v, 1)
        
        ReDim tempArray(Xupper, Yupper)
        For X = 0 To Xupper
            For Y = 0 To Yupper
                tempArray(X, Y) = v(Y, X)
            Next Y
        Next X
        
        TransposeDim = tempArray
    
    
    End Function
    
  5. Premere F5 per eseguire il progetto. Verrà visualizzato Form1.
  6. Fare clic sul pulsante di comando sul Form1 e osservare che il contenuto della tabella Orders viene visualizzato in una nuova cartella di lavoro in Excel.
utilizzando CopyFromRecordset

Per l'efficienza e prestazioni, CopyFromRecordset è il metodo preferito. Poiché in Excel 97 sono supportati solo i recordset DAO con CopyFromRecordset, se si tenta di passare un recordset ADO CopyFromRecordset con Excel 97, è visualizzato il seguente messaggio di errore:
Errore in fase di esecuzione 430:
Classe non supporta l'automazione o non supporta l'interfaccia prevista.
Nell'esempio di codice, è possibile evitare questo errore selezionando di Excel versione in modo da non l'utilizzo CopyFromRecordset per la versione 97.

Nota Quando si utilizza CopyFromRecordset, è necessario tenere presente che il recordset ADO o DAO che è utilizzare non può contenere campi oggetto OLE o dati di matrice, ad esempio i recordset gerarchici. Se si includono campi di entrambi i tipi in un recordset, il metodo di CopyFromRecordset non riesce con il seguente errore:
Errore in fase di esecuzione-2147467259:
Metodo CopyFromRecordset oggetto intervallo non riuscito.
utilizzando il metodo GetRows

Se viene rilevato Excel 97, è possibile utilizzare il metodo GetRows del recordset ADO per copiare il set di record in una matrice. Se si assegna la matrice restituita dal metodo GetRows per un intervallo di celle nel foglio di lavoro, i dati verrà inserito nelle colonne anziché nelle righe. Ad esempio, se nel recordset sono due campi e 10 righe, la matrice verrà visualizzato come due righe e 10 colonne. Pertanto, è necessario per trasporre la matrice utilizzando la funzione TransposeDim() prima di assegnare la matrice all'intervallo di celle. Quando si assegna una matrice a un intervallo di celle, esistono alcune limitazioni da tenere presente alla pagina:

Si applicano quando si assegna una matrice a un oggetto Range di Excel le seguenti limitazioni:
  • La matrice non può contenere campi oggetto OLE o dati di matrice, ad esempio i recordset gerarchici. Si noti che nell'esempio di codice verifica questa condizione e visualizza "Campo matrice", in modo che l'utente è informato che il campo non può essere visualizzato in Excel.

  • La matrice non può contenere i campi di data che contengono una data prima per l'anno 1900. (Vedere la sezione "Riferimenti" un collegamento di base di articolo della Microsoft Knowledge.) Si noti che il codice di esempio formatta i campi data come stringhe di tipo variant per evitare questo potenziale problema.
Nota l'utilizzo della funzione TransposeDim() per trasporre la matrice prima la matrice viene copiato in foglio di lavoro di Excel. Invece di creare una funzione personalizzata per trasporre la matrice, è possibile utilizzare Excel Trasponi funzione modificando il codice di esempio per assegnare la matrice per le celle come illustrato di seguito:
   xlWs.Cells(2, 1).Resize(recCount, fldCount).Value = _
      xlApp.WorksheetFunction.Transpose(recArray)
				
se si decide di utilizzare Trasponi metodo Excel anziché la funzione TransposeDim() per trasporre la matrice, è necessario conoscere le limitazioni seguenti con il metodo Trasponi:
  • La matrice non può contenere un elemento che è maggiore di 255 caratteri.
  • La matrice non può contenere valori null.
  • Il numero di elementi nella matrice non può essere superiore a 5461.
Le limitazioni sopra non vengano presi in considerazione quando si copia una matrice in un foglio di lavoro di Excel, potrebbe verificarsi uno dei seguenti errori di esecuzione:
Errore di run-time 13: Tipo non corrispondente
Errore di runtime 5: Chiamata di routine non valido o argomento
Definiti in fase di esecuzione errore 1004: Applicazione oppure oggetto definiti errore

Riferimenti

Per ulteriori informazioni sulle limitazioni su matrici di passaggio per diverse versioni di Excel, fare clic sul numero dell'articolo della Microsoft Knowledge Base riportato di seguito riportato:
177991  (http://support.microsoft.com/kb/177991/ ) XL: Limitazioni di passaggio di matrici in Excel utilizzando l'automazione
Per ulteriori informazioni, fare clic sui numeri degli articoli della Microsoft Knowledge Base riportati di seguito:
146406  (http://support.microsoft.com/kb/146406/EN-US/ ) XL: Come per il recupero una tabella da Access in Excel con DAO
215965  (http://support.microsoft.com/kb/215965/ ) XL2000: 12: 00: 00 visualizzata per le date precedenti A 1900
243394  (http://support.microsoft.com/kb/243394/ ) Come utilizzare MFC per copiare un Recordset DAO in Excel con l'automazione
247412  (http://support.microsoft.com/kb/247412/ ) INFORMAZIONI: Metodi per il trasferimento di dati in Excel da Visual Basic

Le informazioni in questo articolo si applicano a:
  • Microsoft Office Excel 2007
  • Microsoft Office Excel 2003
  • Microsoft Excel 2002 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft Excel 97 Standard Edition
  • Microsoft Visual Basic 5.0 Professional Edition
  • Microsoft Visual Basic 6.0 Professional Edition
  • Microsoft Visual Basic 5.0 Enterprise Edition
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
Chiavi: 
kbmt kbexpertiseinter kbautomation kbhowto KB246335 KbMtit
Traduzione automatica articoliTraduzione automatica articoli
Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.
Clicca qui per visualizzare la versione originale in inglese dell’articolo: 246335  (http://support.microsoft.com/kb/246335/en-us/ )
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
Condividi
Altre opzioni per il supporto
Forum del supporto di Microsoft Community
Contattaci direttamente
Ricerca di un partner certificato Microsoft
Microsoft Store