Jak přenést data z ADO Recordset Excel s automatizace

Překlady článku Překlady článku
ID článku: 246335 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Automatizace Excel je možné přenést obsah sadu záznamů ADO do listu aplikace Microsoft Excel. Přístup můžete použít, závisí na verzi aplikace Excel jsou automatizace. Aplikace Excel 97, Excel 2000 a Excel 2002 mít CopyFromRecordset metodu, můžete použít k přenosu sadu záznamů rozsah. CopyFromRecordset v aplikaci Excel 2000 a 2002 lze zkopírovat DAO nebo ADO recordset. CopyFromRecordset v aplikaci Excel 97 však podporuje pouze sady záznamů DAO. Sadu záznamů ADO přenést do aplikace Excel 97, vytvořit matici ze sady záznamů a naplnit oblast s obsahem této matice.

Tento článek popisuje oba způsoby. Ukázkový kód prezentovány ilustruje, jak přenést sadu záznamů ADO Excel 97, Excel 2000, Excel 2002, Excel 2003 nebo Excel 2007.

Další informace

Ukázka kódu poskytované níže ukazuje, jak kopírovat ADO recordset listu Microsoft Excel pomocí automatizace z aplikace Microsoft Visual Basic. Kód nejprve zkontroluje verzi aplikace Excel. Pokud je zjištěn Excel 2000 nebo 2002, je použita metoda CopyFromRecordset, protože je efektivní a vyžaduje méně kód. Však Pokud zjištěn aplikace Excel 97 nebo dřívější sady záznamů nejprve zkopírován na matici pomocí metody GetRows objekt ADO recordset. Matice je pak převeden, takže jsou záznamy v první dimenzi (v řádcích) a pole jsou v druhá dimenze (ve sloupcích). Matice poté zkopírován do listu aplikace Excel prostřednictvím přiřazení pole oblast buněk. (Pole je zkopírované v jednom kroku spíše než existující cyklické prostřednictvím každou buňku v listu).

Ukázkový kód používá ukázkové databázi Northwind, která je součástí Microsoft Office. Pokud jste vybrali výchozí složku při instalaci sady Microsoft Office, je databáze umístěna v:

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

Pokud Northwind je databáze umístěna v jiné složce v počítači, musíte upravit cestu databáze v kódu poskytované níže.

Pokud máte databázi Northwind v systému nainstalována, můžete použít možnost grafem.@je instalační program Microsoft Office nainstalovat ukázkové databáze.

Poznámka: Databáze Northwind není nainstalována při instalaci sady Microsoft Office 2007. Získání Northwind 2007 naleznete na následujícím webu:
http://office.microsoft.com/en-us/templates/TC012289971033.aspx

Kroky vytvoření ukázkových

  1. Spusťte jazyka a vytvoření nového projektu standardní EXE. Jako výchozí je vytvořen formulář Form1.
  2. Přidat CommandButton Form1.
  3. Klepněte na příkaz odkazy v nabídce projekt. Přidat odkaz na Knihovně Microsoft ActiveX Data Objects 2.1.
  4. Vložit následující kód do části kódu 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. Stisknutím klávesy F5 spustit projektu. Zobrazí se Form1.
  6. Klepněte na Form1 CommandButton a Poznámka: obsah tabulky objednávky je zobrazena v novém sešitu aplikace Excel.
Pomocí CopyFromRecordset

CopyFromRecordset efektivitu a výkon je upřednostňovaným způsobem. Protože aplikace Excel 97 podporuje sady pouze DAO záznamů s CopyFromRecordset, pokud se pokusíte předat sadu záznamů ADO CopyFromRecordset aplikaci Excel 97, zobrazí se následující chybová zpráva:
Chyba při běhu 430:
Třída nepodporuje automatizaci nebo nepodporuje očekávané rozhraní.
V ukázce kódu vyhnout této chybě kontrolou aplikace Excel verze tak, aby CopyFromRecordset nepoužívejte pro verzi 97.

Poznámka: Při použití CopyFromRecordset měli být vědomi, použijete sadu záznamů ADO nebo DAO nemůže obsahovat polí objektů OLE nebo matice data jako například hierarchické sady záznamů. Pokud sadu záznamů zahrnout pole obou typů, metoda CopyFromRecordset se nezdaří s následující chybou:
Chyba při běhu-2147467259:
Metoda CopyFromRecordset objektu Range se nezdařila.
Pomocí GetRows

Pokud je zjištěn Excel 97, použijte metodu GetRows sadu záznamů ADO zkopírovat sadu záznamů do matice. Pokud přiřadíte matice vrácené GetRows oblast buněk v listu, přejde data ve sloupcích namísto v řádcích. Například pokud sada záznamů má dvě pole a 10 řádků, pole zobrazí jako dva řádky a sloupce 10. Proto musíte transponovat matice pomocí funkce TransposeDim() před přiřazením pole oblast buněk. Při přiřazování matici oblast buněk, jsou některá omezení být vědomi:

Při přiřazování matici objektu Excel Range platí následující omezení:
  • Pole nemůže obsahovat pole dat, například hierarchické sady záznamů nebo polí objektů OLE. Všimněte si, že ukázkový kód zkontroluje tato podmínka a, že uživatel je informována, že pole nelze zobrazit v aplikaci Excel zobrazí "Pole Array".

  • Pole nemůže obsahovat polí datum, které mají datum před rokem 1900. (Viz části "odkazy „ Microsoft Knowledge Base článek odkaz) Poznámka: ukázkový kód formáty polí datum jako řetězců vyhnout potenciální problém.
Poznámka: použití funkce TransposeDim() transponovat matice před matice je zkopírován do listu aplikace Excel. Namísto vytváření vlastní funkce transponovat matice můžete použít aplikace Excel transponovat funkce změnou ukázkový kód přiřadit matice buňky, jak je ukázáno níže:
   xlWs.Cells(2, 1).Resize(recCount, fldCount).Value = _
      xlApp.WorksheetFunction.Transpose(recArray)
				
Pokud se rozhodnete pomocí aplikace Excel transponovat metody namísto funkce TransposeDim() transponovat matice, měli byste být vědoma s metodou transponovat následující omezení:
  • Pole nemůže obsahovat element, který je větší než 255 znaků.
  • Pole nemůže obsahovat hodnoty Null.
  • Počet prvků pole nesmí překročit 5461.
Pokud výše uvedené omezení jsou nebere úvahu při kopírování matice do listu aplikace Excel, může dojít k jedné z následujících chyb běhu:
Run-time chyba 13: Neshoda typu
Run-time Chyba 5: Argument nebo volání procedury neplatný
Run-time error 1004: Definované aplikací nebo objekt definován chyba

Odkazy

Další informace o omezení na předávání matic do různých verzích klepněte na následující číslo článku databáze Microsoft Knowledge Base:
177991XL: Omezení předávání Arrays Excel pomocí automatizace
Další informace naleznete v následujících článcích znalostní báze Microsoft Knowledge Base:
146406XL: Jak načíst tabulku z aplikace Access do aplikace Excel pomocí DAO
215965XL2000: 12: 00: 00 dop dřívější než 1900 zobrazené pro data
243394Jak použít MFC kopírování DAO Recordset Excel s automatizace
247412INFORMACE: Metody pro přenos dat do aplikace Excel z jazyka

Vlastnosti

ID článku: 246335 - Poslední aktualizace: 28. března 2007 - Revize: 5.1
Informace v tomto článku jsou určeny pro produkt:
  • 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 Visual Basic Enterprise Edition for Windows 6.0
  • Microsoft ActiveX Data Objects 2.0
  • Microsoft ActiveX Data Objects 2.1
  • Microsoft ActiveX Data Objects 2.5
Klíčová slova: 
kbmt kbexpertiseinter kbautomation kbhowto KB246335 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:246335

Dejte nám zpětnou vazbu

 

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