2009-07-13 11 views
23

beni nasıl excel sayfasına bir SQL sorgusu sonuçları (2007 Excel) kapmak için gösterir MSDN'den bir VBA kod parçasını kopyalayarak ediyorum: Zaten Microsoft eklemişErişim SQL Veritabanı

Sub GetDataFromADO() 

    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from myTable" 
     objMyCmd.CommandType = adCmdText 
     objMyCmd.Execute 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open objMyCmd 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 

ActiveX Veri Nesneleri 2.1 Kütüphane referans olarak. Ve bu veritabanına erişilebilir. Bu alt program çalıştırdığınızda

Şimdi, bu bir hata var:

Çalışma zamanı hatası 3704: Nesne kapalı olduğunda işleme izin verilmez. ekstresinde

:

ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

herhangi bir fikir neden?

Teşekkürler.

+0

Yardım! Aynı hatayı yaşıyorum, ancak aşağıdaki çözümler yardımcı olmadı: http://stackoverflow.com/questions/1682717/vba-adodb-run-time-error-3704 – Steven

cevap

20

İlk Kataloğu bağlantı dizenize ekledim. Ayrıca kendi SQL deyimi oluşturmak ve bu değişkenin kayıt kümesini açmak için ADODB.Command sözdizimini de kullandım.

Bu yardımcı olur umarım.

Sub GetDataFromADO() 
    'Declare variables' 
     Set objMyConn = New ADODB.Connection 
     Set objMyRecordset = New ADODB.Recordset 
     Dim strSQL As String 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;Initial Catalog=MyDatabase;User ID=abc;Password=abc;" 
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     strSQL = "select * from myTable" 

    'Open Recordset' 
     Set objMyRecordset.ActiveConnection = objMyConn 
     objMyRecordset.Open strSQL    

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 
+2

Benim için çalıştı, teşekkürler, eklemeyi unutmayın Microsoft ActiveX Data Objects 2.1 referansı, 2.6 sürümünü ekledim. Ayrıca sonunda bağlantıyı kapatman gerekmiyor mu? objMyRecordset.Close gibi mi? Parantezleri kaldırmak için –

0

Bu uygun bir bağlantı dizesi mi?
SQL Server örneği nerede bulunur?

Yukarıda belirtilen bağlantı dizesini kullanarak SQL Server'a yapabildiğinizi doğrulamanız gerekir.

DÜZENLEME: Açık olup olmadığını görmek için kayıt kümesinin State özelliğine bakın.
Ayrıca, kayıt kümesini açmadan önce CursorLocation özelliğini adUseClient olarak değiştirin.

1

Bilgisayarda, ilgili yazılım bitlerinin hiçbiri bulunmayan bir bilgisayar başında oturuyorum, ancak bu koddan yanlış görünüyor. Komutu yürütüyorsunuz, ancak objMyCommand.Execute'un döndürdüğü RecordSet'u atıyorsunuz.

Set objMyRecordset = objMyCommand.Execute 

... ve sonra "açık kayıt kümesi" bölümünü kaybeder:

yapardım.

15

Önerilen değişiklikler: Komut yöntemini yürütün nesne çağırmak etmeyin

  • ;
  • Komut nesnesinin olması için Recordset nesnesinin Kaynak özelliğini ayarlayın;
  • Recordset nesnesinin Open yöntemini parametre olmadan çağırın;
  • Parantezleri çağrıdaki Recordset nesnesinin çevresinden CopyFromRecordset;
  • Aslında beyan Değişkenleriniz :)

Revize kodu: (SQL Server iseniz)

Sub GetDataFromADO() 

    'Declare variables' 
     Dim objMyConn As ADODB.Connection 
     Dim objMyCmd As ADODB.Command 
     Dim objMyRecordset As ADODB.Recordset 

     Set objMyConn = New ADODB.Connection 
     Set objMyCmd = New ADODB.Command 
     Set objMyRecordset = New ADODB.Recordset 

    'Open Connection' 
     objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;"  
     objMyConn.Open 

    'Set and Excecute SQL Command' 
     Set objMyCmd.ActiveConnection = objMyConn 
     objMyCmd.CommandText = "select * from mytable" 
     objMyCmd.CommandType = adCmdText 

    'Open Recordset' 
     Set objMyRecordset.Source = objMyCmd 
     objMyRecordset.Open 

    'Copy Data to Excel' 
     ActiveSheet.Range("A1").CopyFromRecordset objMyRecordset 

End Sub 
+0

+1. Nesne başvurularla birleştirilen gereksiz parantezler garip VBA hatalarına neden oluyor gibi görünüyor – barrowc

+0

Bu örnek benim için çalıştı, teşekkürler! – nekomatic

+0

Bunun eski bir iş parçacığı olduğunu anlıyorum, ancak yukarıdaki tabloyu değiştirmek için yukarıdaki kodları değiştirmenin bir yolu olup olmadığını mı merak ediyordum? – firedrawndagger

0

saklanan proc başına set nocount on ekleyin. Bu problemi sadece kendi çalışmamda çözdüm ve gibi ara sonuçların, kullanmak istediğim Recordset'a yüklenmesinden kaynaklandı.

0

@firedrawndagger: alan adlarını listelemek için/sütun başlıkları kayıt kümesi Alanları toplulukta yineleme ve adını ekleyin:

Dim myRS as ADODB.Recordset 
Dim fld as Field 
Dim strFieldName as String 

For Each fld in myRS.Fields 
    Activesheet.Selection = fld.Name 
    [Some code that moves to next column] 
Next