Otomasyon ile ADO Kayıt Kümesinden Excel'e veri aktarma
Özet
Excel'i otomatikleştirerek bir ADO kayıt kümesinin içeriğini Microsoft Excel çalışma sayfasına aktarabilirsiniz. Kullanabileceğiniz yaklaşım, otomatikleştirdiğiniz Excel sürümüne bağlıdır. Excel 97, Excel 2000 ve Excel 2002'de kayıt kümesini bir aralığa aktarmak için kullanabileceğiniz bir CopyFromRecordset yöntemi vardır. Excel 2000 ve 2002'de CopyFromRecordset, DAO veya ADO kayıt kümesini kopyalamak için kullanılabilir. Ancak, Excel 97'deki CopyFromRecordset yalnızca DAO kayıt kümelerini destekler. Bir ADO kayıt kümesini Excel 97'ye aktarmak için, kayıt kümesinden bir dizi oluşturabilir ve ardından bir aralığı bu dizinin içeriğiyle doldurabilirsiniz.
Bu makalede her iki yaklaşım da ele alınmaktadır. Sunulan örnek kod, bir ADO kayıt kümesini Excel 97, Excel 2000, Excel 2002, Excel 2003 veya Excel 2007'ye nasıl aktarabileceğinizi gösterir.
Daha Fazla Bilgi
Aşağıda sağlanan kod örneği, Microsoft Visual Basic'ten otomasyon kullanarak bir ADO kayıt kümesinin Microsoft Excel çalışma sayfasına nasıl kopyalandığını gösterir. Kod önce Excel sürümünü denetler. Excel 2000 veya 2002 algılanırsa, verimli olduğundan ve daha az kod gerektirdiğinden CopyFromRecordset yöntemi kullanılır. Ancak, Excel 97 veya önceki bir sürüm algılanırsa, kayıt kümesi ilk olarak ADO kayıt kümesi nesnesinin GetRows yöntemi kullanılarak bir diziye kopyalanır. Dizi daha sonra, kayıtların ilk boyutta (satırlarda) ve alanların ikinci boyutta (sütunlarda) olması için dönüştürülür. Ardından, dizi bir hücre aralığına atanarak bir Excel çalışma sayfasına kopyalanır. (Dizi, çalışma sayfasındaki her hücrede döngü yerine bir adımda kopyalanır.)
Kod örneği, Microsoft Office'e dahil olan Northwind örnek veritabanını kullanır. Microsoft Office'i yüklerken varsayılan klasörü seçtiyseniz veritabanı şu konumda bulunur:
\Program Files\Microsoft Office\Office\Samples\Northwind.mdb
Northwind veritabanı bilgisayarınızda farklı bir klasörde bulunuyorsa, veritabanının yolunu aşağıda sağlanan kodda düzenlemeniz gerekir.
Sisteminizde Northwind veritabanı yüklü değilse, örnek veritabanlarını yüklemek için Microsoft Office kurulumu için Ekle/Kaldır seçeneğini kullanabilirsiniz.
Not 2007 Microsoft Office'i yüklediğinizde Northwind veritabanı yüklenmez. Northwind 2007'yi edinmek için aşağıdaki Microsoft Web sitesini ziyaret edin:
Örnek Oluşturma Adımları
Visual Basic'i başlatın ve yeni bir Standart EXE projesi oluşturun. Form1 varsayılan olarak oluşturulur.
Form1'e CommandButton ekleyin.
Proje menüsünden Başvurular'a tıklayın. Microsoft ActiveX Veri Nesneleri 2.1 Kitaplığı'na başvuru ekleyin.
Aşağıdaki kodu Form1'in kod bölümüne yapıştırın:
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
Projeyi çalıştırmak için F5 tuşuna basın. Form1 görüntülenir.
Form1'de CommandButton'a tıklayın ve Orders tablosunun içeriğinin Excel'deki yeni bir çalışma kitabında görüntülendiğini unutmayın.
CopyFromRecordset kullanma
Verimlilik ve performans için tercih edilen yöntem CopyFromRecordset'tir. Excel 97 yalnızca CopyFromRecordset içeren DAO kayıt kümelerini desteklediğinden, Bir ADO kayıt kümesini Excel 97 ile CopyFromRecordset'e geçirmeye çalışırsanız, aşağıdaki hatayı alırsınız:
Çalışma zamanı hatası 430: Sınıf Otomasyonu desteklemiyor veya beklenen arabirimi desteklemiyor. Kod örneğinde, 97 sürümü için CopyFromRecordset kullanmamak üzere Excel'in sürümünü denetleyerek bu hatayı önleyebilirsiniz.
Not CopyFromRecordset kullanırken, kullandığınız ADO veya DAO kayıt kümesinin OLE nesne alanlarını veya hiyerarşik kayıt kümeleri gibi dizi verilerini içeremeyeceğini bilmelisiniz. Kayıt kümesine her iki türde de alan eklerseniz CopyFromRecordset yöntemi aşağıdaki hatayla başarısız olur:
Çalışma zamanı hatası -2147467259: Nesne Aralığı'nın CopyFromRecordset yöntemi başarısız oldu.
GetRows kullanma
Excel 97 algılanırsa, kayıt kümesini bir diziye kopyalamak için ADO kayıt kümesinin GetRows yöntemini kullanın. GetRows tarafından döndürülen diziyi çalışma sayfasındaki bir hücre aralığına atarsanız, veriler satırlar yerine sütunlar arasında gider. Örneğin, kayıt kümesinin iki alanı ve 10 satırı varsa, dizi iki satır ve 10 sütun olarak görünür. Bu nedenle, diziyi hücre aralığına atamadan önce TransposeDim() işlevinizi kullanarak diziyi dönüştürmeniz gerekir. Bir diziyi bir hücre aralığına atarken dikkat edilmesi gereken bazı sınırlamalar vardır:
Excel Range nesnesine dizi atarken aşağıdaki sınırlamalar geçerlidir:
Dizi, OLE nesne alanlarını veya hiyerarşik kayıt kümeleri gibi dizi verilerini içeremez. Kod örneğinin bu koşulu denetlediğini ve kullanıcının alanın Excel'de görüntülenemeyeceğini fark edebilmesi için "Dizi Alanı" görüntülediğine dikkat edin.
Dizi, 1900 yılından önceki bir tarihi olan Tarih alanlarını içeremez. (Microsoft Bilgi Bankası makale bağlantısı için "Başvurular" bölümüne bakın.) Kod örneğinin bu olası sorunu önlemek için Tarih alanlarını değişken dizeler olarak biçimlendirdiğini unutmayın.
Dizi Excel çalışma sayfasına kopyalanmadan önce diziyi değiştirmek için TransposeDim() işlevinin kullanıldığına dikkat edin. Diziyi değiştirmek için kendi işlevinizi oluşturmak yerine, aşağıda gösterildiği gibi, diziyi hücrelere atamak için örnek kodu değiştirerek Excel'in İşlemleri Değiştir işlevini kullanabilirsiniz:
xlWs.Cells(2, 1).Resize(recCount, fldCount).Value = _
xlApp.WorksheetFunction.Transpose(recArray)
Diziyi değiştirmek için TransposeDim() işlevi yerine Excel'in Transpose yöntemini kullanmaya karar verirseniz, Dönüştürme yöntemiyle ilgili aşağıdaki sınırlamaları bilmeniz gerekir:
- Dizi 255 karakterden büyük bir öğe içeremez.
- Dizi Null değerler içeremez.
- Dizideki öğe sayısı 5461'i aşamaz.
Bir diziyi Excel çalışma sayfasına kopyalarken yukarıdaki sınırlamalar dikkate alınmazsa, aşağıdaki çalışma zamanı hatalarından biri oluşabilir:
Çalışma Zamanı Hatası 13: Tür Uyuşmazlığı
Çalışma Zamanı Hatası 5: Geçersiz yordam
çağrı veya bağımsız değişken Çalışma Zamanı Hatası 1004: Uygulama tanımlı veya nesne tanımlı hata
Başvurular
Dizileri Excel'in çeşitli sürümlerine geçirme sınırlamaları hakkında ek bilgi için, Microsoft Bilgi Bankası'ndaki makaleyi görüntülemek üzere aşağıdaki makale numarasını tıklatın:
177991 XL: Otomasyon Kullanarak Dizileri Excel'e Geçirme sınırlamaları
247412 BİlGİ: Visual Basic'ten Excel'e Veri Aktarma Yöntemleri