2009-07-13 13 views
23

मैं मुझे कैसे एक्सेल शीट में एक SQL क्वेरी से परिणाम (Excel 2007) हड़पने के लिए पता चलता है कि MSDN से एक VBA कोड स्निपेट को कॉपी कर रहा हूँ:एक्सेल-VBA में प्रवेश एसक्यूएल डाटाबेस

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 डेटा ऑब्जेक्ट 2.1 लाइब्रेरी। और यह डेटाबेस सुलभ है।

अब, जब मैं इस सबरूटीन चलाने के लिए, यह एक त्रुटि है:

रन-टाइम त्रुटि 3704: जब वस्तु बंद कर दिया है ऑपरेशन अनुमति नहीं है।

बयान पर:

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

किसी भी विचार क्यों?

धन्यवाद।

+0

मदद! मुझे एक ही त्रुटि है, लेकिन नीचे दिए गए समाधानों में मदद नहीं मिली: http://stackoverflow.com/questions/1682717/vba-adodb-run-time-error-3704 – Steven

उत्तर

20

मैंने आपके कनेक्शन स्ट्रिंग में प्रारंभिक कैटलॉग जोड़ा है। मैंने अपने स्वयं के एसक्यूएल स्टेटमेंट को बनाने और उस चर पर रिकॉर्डसेट खोलने के पक्ष में ADODB.Command वाक्यविन्यास को भी छोड़ दिया है।

उम्मीद है कि इससे मदद मिलती है।

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

यह मेरे लिए काम करता है, धन्यवाद, जोड़ना याद रखना माइक्रोसॉफ़्ट एक्टिवैक्स डेटा ऑब्जेक्ट्स 2.1 का संदर्भ, मैंने 2.6 संस्करण जोड़ा हालांकि। क्या आपको अंत में कनेक्शन बंद करने की आवश्यकता नहीं है? objMyRecordset की तरह। बंद करो? कोष्ठक हटाने के लिए –

0

क्या यह एक उचित कनेक्शन स्ट्रिंग है?
SQL सर्वर उदाहरण कहां स्थित है?

आपको यह सत्यापित करने की आवश्यकता होगी कि आप ऊपर निर्दिष्ट निर्दिष्ट कनेक्शन स्ट्रिंग का उपयोग कर SQL सर्वर से जुड़ने में सक्षम हैं।

संपादित करें: रिकॉर्डसेट की राज्य संपत्ति को देखने के लिए यह देखने के लिए कि क्या यह खुला है या नहीं?
इसके अलावा, रिकॉर्डसेट खोलने से पहले CursorLocation प्रॉपर्टी को adUseClient में बदलें।

1

मैं कंप्यूटर पर किसी भी प्रासंगिक बिट्स के साथ कंप्यूटर पर बैठा हूं, लेकिन स्मृति से यह कोड गलत दिखता है। आप कमांड निष्पादित कर रहे हैं लेकिन RecordSet को छोड़कर objMyCommand.Execute रिटर्न।

मुझे क्या करना चाहते हैं:

Set objMyRecordset = objMyCommand.Execute 

... और फिर "खुला recordset" भाग खो देते हैं।

15

सुझाए गए बदलाव:

  • आह्वान मत कमान वस्तु की विधि निष्पादित;
  • रिकॉर्ड्स ऑब्जेक्ट की स्रोत प्रॉपर्टी को अपनी कमांड ऑब्जेक्ट सेट करें;
  • किसी भी पैरामीटर के साथ रिकॉर्ड्स ऑब्जेक्ट की ओपन विधि को आमंत्रित करें;
  • CopyFromRecordset पर कॉल में रिकॉर्ड्स ऑब्जेक्ट के आसपास से कोष्ठक निकालें;
  • अपने चर असल में घोषित :)

संशोधित कोड:

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। ऑब्जेक्ट संदर्भों के साथ संयुक्त अनावश्यक कोष्ठक अजीब वीबीए त्रुटियों का कारण बनते हैं – barrowc

+0

यह उदाहरण मेरे लिए काम करता है, धन्यवाद! – nekomatic

+0

मुझे एहसास है कि यह एक पुराना धागा है - लेकिन यह सोच रहा था कि टेबल हेडर को पुनर्प्राप्त करने के लिए उपरोक्त कोड को संशोधित करने का कोई तरीका है या नहीं? – firedrawndagger

0

संग्रहीत proc की शुरुआत करने के लिए set nocount on जोड़े (यदि आप SQL सर्वर पर हैं)। मैंने अभी इस समस्या को अपने काम में हल किया है और यह "1203 Rows Affected" जैसे मध्यवर्ती परिणामों के कारण हुआ था, Recordset में लोड किया जा रहा था, मैं उपयोग करने की कोशिश कर रहा था।

0

@firedrawndagger: फ़ील्ड नाम सूची/कॉलम हेडर recordset फील्ड्स संग्रह के माध्यम से पुनरावृति और नाम सम्मिलित करें:

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 
संबंधित मुद्दे