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

Ö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
Ö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:

Ö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 = NothingEnd SubFunction 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 = tempArrayEnd 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
Eşleşmeyen XL2007 sırasını değiştir

Uyarı: Bu makalenin çevirisi otomatik olarak yapılmıştır

Özellikler

Makale No: 246335 - Son İnceleme: 03/28/2007 23:17:43 - Düzeltme: 5.1

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

  • kbmt kbexpertiseinter kbautomation kbhowto KB246335 KbMttr
Geri bildirim