Πώς μπορείτε να μεταφέρετε δεδομένα από μια ομάδα εγγραφών ADO σε Excel με αυτοματοποίηση

Μεταφράσεις άρθρων Μεταφράσεις άρθρων
Αναγν. άρθρου: 246335 - Δείτε τα προϊόντα στα οποία αναφέρεται το συγκεκριμένο άρθρο.
Ανάπτυξη όλων | Σύμπτυξη όλων

Σε αυτήν τη σελίδα

Περίληψη

Μπορείτε να μεταφέρετε το περιεχόμενο από μια ομάδα εγγραφών ADO σε ένα φύλλο εργασίας του Microsoft Excel με την αυτοματοποίηση του Excel. Η προσέγγιση που μπορείτε να χρησιμοποιήσετε εξαρτάται από την έκδοση του Excel αυτοματοποιείτε. Excel 97, το Excel 2000 και το Excel 2002 έχει μέθοδο CopyFromRecordset που μπορείτε να χρησιμοποιήσετε για να μεταφέρετε ένα σύνολο εγγραφών σε μια περιοχή. CopyFromRecordset στο Excel 2000 και 2002 μπορεί να χρησιμοποιηθεί για να αντιγράψετε ένα DAO ή μια ομάδα εγγραφών ADO. Ωστόσο, CopyFromRecordset στο Excel 97 υποστηρίζουν μόνο σύνολα εγγραφών DAO. Για να μεταφέρετε μια ομάδα εγγραφών ADO σε Excel 97, μπορείτε να δημιουργήσετε έναν πίνακα από το αντικείμενο recordset και κατόπιν συμπληρώστε μια περιοχή με τα περιεχόμενα αυτού του πίνακα.

Αυτό το άρθρο περιγράφει δύο προσεγγίσεις. Παρουσιάζονται δείγμα κώδικα δείχνει πώς μπορείτε να μεταφέρετε μια ομάδα εγγραφών ADO σε Excel 97, Excel 2000, Excel 2002, Excel 2003 ή Excel 2007.

Περισσότερες πληροφορίες

Το δείγμα κώδικα που παρέχεται παρακάτω παρουσιάζει τον τρόπο αντιγραφής ενός ADO recordset σε ένα φύλλο εργασίας του Microsoft Excel με αυτοματισμό από τη Microsoft Visual Basic. Ο κώδικας ελέγχει πρώτα την έκδοση του Excel. Εάν εντοπιστεί το Excel 2000 ή 2002, χρησιμοποιείται η μέθοδος CopyFromRecordset επειδή είναι αποτελεσματική και απαιτεί μικρότερο κωδικό. Ωστόσο, εάν εντοπιστεί το Excel 97 ή παλαιότερο, το σύνολο εγγραφών αντιγράφεται πρώτα σε πίνακα, χρησιμοποιώντας τη μέθοδο GetRows, από το αντικείμενο ADO recordset. Ο πίνακας είναι κατόπιν μετέτρεψε έτσι ώστε οι εγγραφές στην πρώτη διάσταση (στις γραμμές) και πεδία που βρίσκονται στη δεύτερη διάσταση (στις στήλες). Στη συνέχεια, ο πίνακας αντιγράφεται σε ένα φύλλο εργασίας του Excel με την αντιστοίχιση του πίνακα σε μια περιοχή κελιών. (Ο πίνακας είναι αντιγράψατε σε ένα βήμα και όχι βρόχου μέσω κάθε κελί του φύλλου εργασίας.)

Το δείγμα κώδικα χρησιμοποιεί το δείγμα βάσης δεδομένων Northwind που περιλαμβάνεται στο Microsoft Office. Εάν επιλέξατε τον προεπιλεγμένο φάκελο, κατά την εγκατάσταση του Microsoft Office, η βάση δεδομένων βρίσκεται σε:

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

Εάν η βάση δεδομένων βρίσκεται σε διαφορετικό φάκελο στον υπολογιστή σας Northwind, θα πρέπει να επεξεργαστείτε τη διαδρομή της βάσης δεδομένων στον κώδικα που παρέχεται παρακάτω.

Εάν δεν έχετε τη βάση δεδομένων Northwind που έχει εγκατασταθεί στο σύστημά σας, μπορείτε να χρησιμοποιήσετε την επιλογή Προσθήκη/Κατάργηση εγκατάστασης του Microsoft Office για να εγκαταστήσετε τα δείγματα βάσεων δεδομένων.

ΣΗΜΕΙΩΣΗΗ βάση δεδομένων Northwind δεν εγκαθίσταται κατά την εγκατάσταση του 2007 Microsoft Office. Για να αποκτήσετε Northwind 2007, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft στο Web:
http://Office.Microsoft.com/en-us/Templates/TC012289971033.aspx

Βήματα για τη δημιουργία του δείγματος

  1. Εκκίνηση της Visual Basic και να δημιουργήσετε ένα νέο έργο Standard EXE. Φόρμα1 δημιουργείται από προεπιλογή.
  2. Προσθήκη ενόςΣτοιχείο CommandButtonΓια να Φόρμα1.
  3. Κάντε κλικΑναφορέςαπό τοΤο έργοΜενού (Menu). Προσθέστε μια αναφορά για τοMicrosoft ActiveX Data Objects 2.1 βιβλιοθήκης.
  4. Επικολλήστε τον ακόλουθο κώδικα στην ενότητα κώδικα της Φόρμα1:
    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. Πιέστε το πλήκτρο F5 για να εκτελέσετε το έργο. Εμφανίζεται το παράθυρο Φόρμα1.
  6. Κάντε κλικ στην καρτέλαΣτοιχείο CommandButtonΦόρμα1 και Σημειώστε ότι εμφανίζεται το περιεχόμενο του πίνακα "Παραγγελίες" σε ένα νέο βιβλίο εργασίας του Excel.
Χρήση CopyFromRecordset

Για την αποτελεσματικότητα και την απόδοση, CopyFromRecordset είναι η προτιμώμενη μέθοδος. Επειδή το Excel 97 υποστηρίζει μόνο το DAO σύνολα εγγραφών με CopyFromRecordset, εάν επιχειρήσετε να μεταβιβάσει μια ομάδα εγγραφών ADO CopyFromRecordset με το Excel 97, λαμβάνετε το ακόλουθο μήνυμα λάθους:
Σφάλμα χρόνου εκτέλεσης 430:
Η κλάση δεν υποστηρίζει την αυτοματοποίηση ή δεν υποστηρίζει την αναμενόμενη διασύνδεση.
Στο δείγμα κώδικα, μπορείτε να αποφύγετε αυτό το σφάλμα κατά τον έλεγχο του Excel έκδοση, έτσι ώστε να μην χρησιμοποιείτε CopyFromRecordset για την έκδοση 97.

ΣΗΜΕΙΩΣΗΌταν χρησιμοποιείτε το CopyFromRecordset, θα πρέπει να γνωρίζετε ότι η ομάδα εγγραφών ADO ή DAO που χρησιμοποιείτε δεν είναι δυνατό να περιέχουν πεδία αντικειμένου OLE ή πίνακα δεδομένων, όπως τα ιεραρχικά σύνολα εγγραφών. Εάν μπορείτε να συμπεριλάβετε πεδία από δύο τύπους σε ένα σύνολο εγγραφών, η μέθοδος CopyFromRecordset αποτυγχάνει με το ακόλουθο μήνυμα λάθους:
Σφάλμα χρόνου εκτέλεσης-2147467259:
Η μέθοδος CopyFromRecordset της περιοχής του αντικειμένου απέτυχε.
Χρήση της GetRows

Εάν εντοπιστεί το Excel 97, χρησιμοποιήστε τη μέθοδο GetRows του συνόλου εγγραφών ADO για να αντιγράψετε το σύνολο εγγραφών σε έναν πίνακα. Εάν αναθέσετε στον πίνακα που επιστρέφει η GetRows σε μια περιοχή κελιών στο φύλλο εργασίας, τα δεδομένα πάει κατά μήκος των στηλών αντί για τις γραμμές. Για παράδειγμα, εάν το αντικείμενο recordset διαθέτει δύο πεδία και 10 γραμμές, ο πίνακας εμφανίζεται ως δύο γραμμές και στήλες 10. Επομένως, πρέπει να αντιμεταθέσετε πίνακα χρησιμοποιώντας την συνάρτηση TransposeDim() πριν να εκχωρήσετε τον πίνακα στην περιοχή κελιών. Κατά την αντιστοίχιση ενός πίνακα σε μια περιοχή κελιών, υπάρχουν ορισμένοι περιορισμοί να γνωρίζετε:

Κατά την αντιστοίχιση ενός πίνακα σε ένα αντικείμενο περιοχής του Excel, ισχύουν οι παρακάτω περιορισμοί:
  • Ο πίνακας δεν μπορεί να περιέχει πεδία αντικειμένου OLE ή πίνακα δεδομένων, όπως τα ιεραρχικά σύνολα εγγραφών. Παρατηρήστε ότι το δείγμα κώδικα ελέγχει για αυτή τη συνθήκη και εμφανίζει την ένδειξη "Πεδίου πίνακα", έτσι ώστε ο χρήστης γίνει γνωρίζει ότι το πεδίο δεν μπορεί να εμφανιστεί στο Excel.

  • Ο πίνακας δεν είναι δυνατό να περιέχει τα πεδία Ημ/νία που έχουν μια ημερομηνία προγενέστερη από το έτος 1900. (Ανατρέξτε στην ενότητα "Αναφορές" για μια σύνδεση βάσης άρθρο της Microsoft Knowledge). Σημειώστε ότι το δείγμα κώδικα μορφοποιεί τα πεδία Ημ/νία ως μεταβλητή συμβολοσειρές για να αποφύγετε αυτό το ενδεχόμενο πρόβλημα.
Σημείωση η χρήση της συνάρτησης TransposeDim() την αναστροφή του πίνακα πριν τον πίνακα αντιγράφονται στο φύλλο εργασίας του Excel. Αντί να δημιουργήσετε τις δικές σας συνάρτηση για να αντιμεταθέσετε πίνακα, μπορείτε να χρησιμοποιήσετε του Excel μετατόπιση συνάρτηση τροποποιώντας το δείγμα κώδικα για την αντιστοίχιση του πίνακα στα κελιά, όπως φαίνεται παρακάτω:
   xlWs.Cells(2, 1).Resize(recCount, fldCount).Value = _
      xlApp.WorksheetFunction.Transpose(recArray)
				
Εάν αποφασίσετε να χρησιμοποιήσετε τη μέθοδο ανάστροφος του Excel αντί της συνάρτησης TransposeDim() για να αντιμεταθέσετε πίνακα, θα πρέπει να λάβετε υπόψη τους ακόλουθους περιορισμούς με τη μέθοδο ανάστροφος:
  • Ο πίνακας δεν είναι δυνατό να περιέχει ένα στοιχείο που είναι μεγαλύτερη από 255 χαρακτήρες.
  • Ο πίνακας δεν είναι δυνατό να περιέχουν τιμές Null.
  • Ο αριθμός των στοιχείων του πίνακα δεν είναι δυνατό να υπερβαίνει τους 5461.
Εάν οι παραπάνω περιορισμοί δεν λαμβάνονται υπόψη, όταν αντιγράφετε έναν πίνακα σε ένα φύλλο εργασίας του Excel, ενδέχεται να παρουσιαστεί ένα από τα παρακάτω σφάλματα χρόνου εκτέλεσης:
13 Σφάλμα χρόνου εκτέλεσης: Ασυμφωνία τύπου
Σφάλμα χρόνου εκτέλεσης 5: Κλήση διαδικασίας δεν είναι έγκυρο ή το όρισμα
Ορισμός εφαρμογής 1004 σφάλμα χρόνου εκτέλεσης: Ή αντικειμένου που ορίζεται σε σφάλμα

Αναφορές

Για πρόσθετες πληροφορίες σχετικά με τους περιορισμούς για τη διαβίβαση πινάκων σε διάφορες εκδόσεις του Excel, κάντε κλικ στον αριθμό του άρθρου παρακάτω για να προβάλετε το άρθρο της Γνωσιακής Βάσης της Microsoft:
177991XL: Περιορισμοί του διαβίβαση πίνακες στο Excel με αυτοματισμό
Για πρόσθετες πληροφορίες, κάντε κλικ στους αριθμούς των άρθρων παρακάτω, για να προβάλετε τα άρθρα της Γνωσιακής Βάσης της Microsoft (Knowledge Base):
146406XL: Τρόπος ανάκτηση ενός πίνακα από την Access στο Excel χρησιμοποιώντας DAO
215965XL2000: 12: 00: 00 πμ εμφανίζεται νωρίτερα από το 1900 για ημερομηνίες
243394Τρόπος χρήσης MFC για την αντιγραφή ενός αντικειμένου Recordset DAO σε Excel με αυτοματισμό
247412ΠΛΗΡΟΦΟΡΙΕΣ: Μέθοδοι για τη μεταφορά δεδομένων στο Excel από τη Visual Basic

Ιδιότητες

Αναγν. άρθρου: 246335 - Τελευταία αναθεώρηση: Δευτέρα, 27 Σεπτεμβρίου 2010 - Αναθεώρηση: 2.0
Οι πληροφορίες σε αυτό το άρθρο ισχύουν για:
  • Microsoft Office Excel 2007
  • 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
Λέξεις-κλειδιά: 
kbexpertiseinter kbautomation kbhowto kbmt KB246335 KbMtel
Μηχανικά μεταφρασμένο
ΣΗΜΑΝΤΙΚΟ: Αυτό το άρθρο είναι προϊόν λογισμικού μηχανικής μετάφρασης της Microsoft και όχι ανθρώπινης μετάφρασης. Η Microsoft σάς προσφέρει άρθρα που είναι προϊόντα ανθρώπινης αλλά και μηχανικής μετάφρασης έτσι ώστε να έχετε πρόσβαση σε όλα τα άρθρα της Γνωσιακής Βάσης μας στη δική σας γλώσσα. Ωστόσο, ένα άρθρο που έχει προκύψει από μηχανική μετάφραση δεν είναι πάντα άριστης ποιότητας. Ενδέχεται να περιέχει λεξιλογικά, συντακτικά ή γραμματικά λάθη, όπως ακριβώς τα λάθη που θα έκανε ένας μη φυσικός ομιλητής επιχειρώντας να μιλήσει τη γλώσσα σας. Η Microsoft δεν φέρει καμία ευθύνη για τυχόν ανακρίβειες, σφάλματα ή ζημίες που προκύψουν λόγω τυχόν παρερμηνειών στη μετάφραση του περιεχομένου ή χρήσης του από τους πελάτες της. Επίσης, η Microsoft πραγματοποιεί συχνά ενημερώσεις στο λογισμικό μηχανικής μετάφρασης.
Η αγγλική έκδοση αυτού του άρθρου είναι η ακόλουθη:246335

Αποστολή σχολίων

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com