ADO kayıt kümesindeki verileri Otomasyon ile Excel'e aktarma hakkında

Makale çevirileri Makale çevirileri
Makale numarası: 246335 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Excel'in otomatik olarak bir Microsoft Excel çalışma sayfasına bir ADO kayıt kümesi içeriğini transfer edebilirsiniz. Kullanabileceğiniz bir yaklaşım, otomatikleştirme Excel sürümünde bağlıdır. Excel 97, Excel 2000 ve Excel 2002 için bir kayıt aralığı için transfer etmek için kullanabileceğiniz bir CopyFromRecordset yöntemi vardır. Excel 2000 ve 2002 CopyFromRecordset bir DAO veya ADO kayıt kopyalamak için kullanılabilir. Ancak, Excel 97'de CopyFromRecordset yalnızca DAO Kayıt kümesi destekler. Bir ADO kayıt kümesi, Excel 97'ye aktarmak için <a0></a0>, kayıt kümesi ' bir dizi oluşturabileceğiniz ve sonra da bir aralık, bir dizi içeriğiyle doldurmak.

Bu makalede, her iki yaklaşımdan anlatılır. Gösterilen örnek kod, Excel 97, Excel 2000, Excel 2002, Excel 2003 ve Excel 2007 için bir ADO kayıt kümesi nasıl aktarabilirsiniz göstermektedir.

Daha fazla bilgi

Aşağıda verilen kod örneği, bir ADO kopyalama gösteren <a1>Otomasyon</a1> alanından, Microsoft Visual Basic kullanarak bir Excel çalışma sayfası için kayıt kümesi. Kod, önce Excel sürümünü denetler. Excel 2000 veya 2002 algıladı, etkin olduğundan ve daha az kod gerektiren CopyFromRecordset yöntemi kullanılır. Ancak, Excel 97 veya önceki algılanırsa, kayıt kümesinin ilk ADO recordset nesnesi GetRows yöntemini kullanarak bir diziye kopyalanır. Dizi sonra ilk boyuta (satırlar) kayıtlardır ve ikinci boyutun (sütun) bulunan alanlardır guıd'nin yerleri. Sonra dizinin, bir Excel çalışma sayfasına bir hücre aralığına dizi gerçekleştirebilecekleri kopyalanır. (Tek bir adımda kopyalanan yerine çalışma sayfasındaki her hücreye döngü dizidir.)

Kod örneği, Microsoft Office ile gelen örnek Northwind veritabanını kullanır. Microsoft Office'in yüklü olduğunda, varsayılan klasör seçtiyseniz, veritabanı bulunur:

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

Northwind veritabanı ve bilgisayarınızdaki farklı bir klasörde bulunan, aşağıda verilen kod veri tabanının yolu düzenlemeniz gerekiyorsa.

Northwind veritabanını sisteminizde yüklü değilse, örnek veritabanları yüklemek için Microsoft Office Kur için <a1>Ekle/Kaldır</a1> seçeneğini kullanabilirsiniz.

Not 2007 Microsoft Office yüklediğinizde, Northwind veritabanı yüklü değil. Northwind 2007 edinmek için aşağıdaki Microsoft Web sitesini ziyaret edin:
http://office.microsoft.com/en-us/templates/TC012289971033.aspx

Örnek oluşturma adımları

  1. Visual Basic'ı başlatın ve yeni bir standart exe DOSYASı) projesi oluşturun. Varsayılan olarak, Form1 oluşturulur.
  2. Bir KomutDüğmesi Form1'e ekleyin.
  3. BaşvurularProje menüsünde'ı tıklatın. Microsoft ActiveX Data Objects 2.1 kitaplığı ' na bir başvuru ekleyin.
  4. <a1>Yapıştır</a1> içine Form1 <a1>Kod</a1> bölümüne aşağıdaki kodu:
    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. Proje çalıştırmak için F5 tuşuna basın. Form1 görüntülenir.
  6. Form1, KomutDüğmesi ' ı tıklatın ve Siparişler tablosundaki içerikleri görüntülenir, yeni bir çalışma kitabındaki Excel'deki unutmayın.
CopyFromRecordset kullanma

Performansı ve verimliliği CopyFromRecordset tercih edilen yöntemdir. Bir ADO kayıt kümesi, Excel 97 ile CopyFromRecordset geçirmeye çalıştığınızda, Excel 97 ile CopyFromRecordset, yalnızca DAO Kayıt kümesi desteklediği için aşağıdaki hatayı alırsınız:
Çalışma zamanı hatası 430:
Sınıf Otomasyonu desteklemiyor ya da beklenen arabirimi desteklemiyor.
Kod örneğinde, Excel'in denetleyerek bu hatayı önleyebilirsiniz sürüm 97 sürümü için CopyFromRecordset kullanmak.

Not CopyFromRecordset kullanırken, kullandığınız ADO veya DAO Kayıt kümesi OLE nesnesi alanları veya dizi verileri hiyerarşik kayıt kümeleri gibi içeremez bilmelisiniz. CopyFromRecordset yöntem, bir kayıt kümesindeki her iki türü alanları içeriyorsa, aşağıdaki hata ile başarısız olur:
Çalışma zamanı hatası-2147467259:
Yöntemi, Nesne aralığı CopyFromRecordset başarısız oldu.
GetRows kullanma

Excel 97 algılanırsa, kayıt, bir dizi içine kopyalamak için GetRows yöntemini ADO kayıt kümesini kullanın. Çalışma sayfasındaki bir hücre aralığı için GetRows tarafından döndürülen bir dizi atarsanız, kolon satırlarda yerine verileri gider. Örneğin, kayıt kümesi, iki alan ve 10 satır varsa, dizinin iki satır ve 10 sütunlar görünür. Bu nedenle, bir hücre aralığına dizi atamadan önce TransposeDim() işlevini kullanarak bir dizi işlem tablosunda devrik dönüştürmek gerekir. Bir hücre aralığına dizi atarken haberdar bazı sınırlamalar vardır:

Bir dizi Excel aralığı nesneye atarken, aşağıdaki kısıtlamalar geçerlidir:
  • Dizinin, OLE nesnesi alanları veya hiyerarşik kayıt kümeleri gibi bir dizi veri içeremez. Kod örneği, bu koşul için denetler ve "Dizi alanı" görüntüler, böylece kullanıcı bilgisi alanı Excel'de görüntülenemiyor yapılan dikkat edin.

  • Dizinin, tarihi önceki yıl, 1900 tarih alanları içeremez. (Microsoft Bilgi Bankası makalesi bağlantısı için "Başvurular" bölümüne bakın.) Not kod örneğini tarih alanları bu olası sorunu önlemek için değişken dizeler biçimlendirir.
Not kullanımını TransposeDim() işlevi, dizi, dizi önce işlem tablosunda devrik dönüştürmek, Excel çalışma sayfasına kopyalanır. Kendi işlevi, dizi işlem tablosunda devrik dönüştürmek oluşturmak yerine, Excel'in kullanabileceğiniz örnek kod, dizi, a?a??da gösterildi?i gibi hücrelere atamak için değiştirerek işlevi işlemi tersine çevir:
   xlWs.Cells(2, 1).Resize(recCount, fldCount).Value = _
      xlApp.WorksheetFunction.Transpose(recArray)
				
dizi devriğini almak yerine TransposeDim() işlevi Excel'in devrik yöntemi kullanmaya karar verirseniz, aşağıdaki sınırlamalar devrik yöntemiyle bilmeniz:
  • Dizi 255 karakterden büyük olan bir öğe içeremez.
  • Dizi null değeri içeremez.
  • Dizideki öğelerin sayısı 5461 geçemez.
Excel çalışma sayfasına bir dizi kopyaladığınızda, yukarıdaki sınırlamalar dikkate alındığı takdirde, aşağıdaki çalışma zamanı hataları biri oluşabilir:
Çalışma zamanı hatası: 13: Tür uyuşmazlığı
Çalışma zamanı hata 5: Geçersiz yordam çağrısı veya bağımsız değişken
Çalışma zamanı hatası 1004: Uygulama tanımlı veya nesne hata tanımlanmış

Referanslar

Excel'in çeşitli sürümleri için geçirme dizilerinde kısıtlamaları hakkında ek bilgi için Microsoft Knowledge Base'deki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
177991XL: Excel Otomasyonu kullanma Arrays gönderme, kısıtlamaları
Ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleleri görüntülemek üzere aşağıdaki makale numaralarını tıklatın:
146406XL: nasıl tablo Access'ten DAO kullanarak Excel'e Al
215965XL2000: 12: 00: 00'için bir tarihler 1900 daha önceki bir sürümü görüntülenen de
243394Kullanım nasıl MFC bir DAO Kayıt kümesi Otomasyon ile Excel'e kopyalama
247412BILGI: verilerini Visual Basic'den Excel'e aktarma yöntemleri

Özellikler

Makale numarası: 246335 - Last Review: 28 Mart 2007 Çarşamba - Gözden geçirme: 5.1
Bu makaledeki bilginin uygulandığı durum:
  • 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
Anahtar Kelimeler: 
kbmt kbexpertiseinter kbautomation kbhowto KB246335 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:246335

Geri Bildirim Ver

 

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