2012-01-31 14 views
10

से डेटा प्राप्त करने के लिए एक्सेल वीबीए लिखना मैं एक एक्सेल एप्लिकेशन लिख रहा हूं जो काम के लिए एक्सेस डेटाबेस से खींचता है। जब उपयोगकर्ता एक्सेल टूल खोलता है, तो डेटा तालिका को मेरे द्वारा बनाए गए एक्सेस डेटाबेस से वर्कशीट में से एक को पॉप्युलेट करने की आवश्यकता होती है। मैं एक्सेल में वीबीए कोड लिख रहा हूं और मुझे रन-टाइम त्रुटि मिल रही है: "42 9" ActiveX घटक ऑब्जेक्ट नहीं बना सकता है।एक्सेस

अन्य प्रश्न सभी एक्सेस से लिखे गए हैं लेकिन मुझे विश्वास है कि मुझे Excel कार्यपुस्तिका फ़ाइल से लिखे गए इस कोड की आवश्यकता है। मैंने जो कोड लिखा है वह Workbook_Open() फ़ंक्शन में है ताकि उपयोगकर्ता फ़ाइल को खोलने के बाद डेटा एकत्र किया जा सके। मदद के लिए बहुत बहुत धन्यवाद। Btw, मैं Access 2007 और Excel 2010.

Private Sub Workbook_Open() 
    'Will fill the first listbox with data from the Access database 
    Dim DBFullName As String 
    Dim TableName As String 
    Dim FieldName As String 
    Dim TargetRande As String 

    DBFullName = "D:\Tool_Database\Tool_Database.mdb" 

    Dim db As DAO.Database, rs As Recordset 
    Dim intColIndex As Integer 

    Set TargetRange = Range("A1") 
    Set db = OpenDatabase(DBFullName) 
    Set rs = db.OpenRecordset("SELECT * FROM ToolNames WHERE Item = 'Tool'", dbReadOnly) 

    ' Write the field names 
    For intColIndex = 0 To rs.Fields.Count - 1 
     TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name 
    Next 

    ' Write recordset 
    TargetRange.Offset(1, 0).CopyFromRecordset rs 

    Set rs = Nothing 
    db.Close 
    Set db = Nothing 
End Sub 
+0

आईडीई में, उपकरण -> संदर्भ; आपको "माइक्रोसॉफ्ट दाओ एक्स.XX ऑब्जेक्ट लाइब्रेरी" की जरूरत है, क्या यह मामला है? यदि ऐसा है तो कौन सा संस्करण? –

+0

मेरे पास "माइक्रोसॉफ्ट डीएओ 3.6 ऑब्जेक्ट लाइब्रेरी" चेक है। अब यह मुझे रन-टाइम त्रुटि दे रहा है 3024 एप्लिकेशन-डिफ़ाइंड या ऑब्जेक्ट-डिफ़ाइंड त्रुटि – thebiglebowski11

+0

ऐसा लगता है कि फ़ाइल नहीं मिली है, सुनिश्चित करें कि पथ सही है? –

उत्तर

8

टायलर, क्या आप कृपया मेरे लिए इस कोड का परीक्षण कर सकते हैं? अगर आपको कोई त्रुटि मिलती है तो आपको एक संदेश बॉक्स मिलेगा। बस संदेश बॉक्स का स्नैपशॉट पोस्ट करें।

'~~> Remove all references as the below code uses Late Binding with ADO. 

Private Sub Workbook_Open() 
      Dim cn As Object, rs As Object 
      Dim intColIndex As Integer 
      Dim DBFullName As String 
      Dim TargetRange As Range 

10  DBFullName = "D:\Tool_Database\Tool_Database.mdb" 

20  On Error GoTo Whoa 

30  Application.ScreenUpdating = False 

40  Set TargetRange = Sheets("Sheet1").Range("A1") 

50  Set cn = CreateObject("ADODB.Connection") 
60  cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";" 

70  Set rs = CreateObject("ADODB.Recordset") 
80  rs.Open "SELECT * FROM ToolNames WHERE Item = 'Tool'", cn, , , adCmdText 

      ' Write the field names 
90  For intColIndex = 0 To rs.Fields.Count - 1 
100   TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name 
110  Next 

      ' Write recordset 
120  TargetRange.Offset(1, 0).CopyFromRecordset rs 

LetsContinue: 
130  Application.ScreenUpdating = True 
140  On Error Resume Next 
150  rs.Close 
160  Set rs = Nothing 
170  cn.Close 
180  Set cn = Nothing 
190  On Error GoTo 0 
200  Exit Sub 
Whoa: 
210  MsgBox "Error Description :" & Err.Description & vbCrLf & _ 
      "Error at line  :" & Erl & vbCrLf & _ 
      "Error Number  :" & Err.Number 
220  Resume LetsContinue 
End Sub 
+1

हाँ :) मैं इसे काफी समय से उपयोग कर रहा हूं। आप यह जानना नहीं चाहते कि मैं पहले क्या उपयोग कर रहा था :-D HINT: यह एक प्रश्न के लिए एक 3 अक्षर का संक्षिप्त शब्द है जो त्रुटि होने पर स्वचालित रूप से हमारे दिमाग में आता है :) –

+0

यह बहुत समझ में नहीं आता है ... MsgBox पढ़ता है: त्रुटि विवरण: फ़ाइल 'D: \ Tool_Database \ Tool_Database.mdb लाइन में त्रुटि नहीं मिली: 0 त्रुटि संख्या: -2147467259 – thebiglebowski11

+0

यह निश्चित रूप से मेरे डेटाबेस का स्थान है ... – thebiglebowski11

0

यह मेरी मशीन पर ठीक काम करता है (फ़ील्ड नाम डेटा की पहली पंक्ति द्वारा ओवरराइट को छोड़कर उपयोग कर रहा हूँ - फ़ील्ड नाम के लिए तो आप शायद मतलब TargetRange.Offset (0 , intColIndex))।

क्या आपके पास टूल्स -> संदर्भ ... माइक्रोसॉफ्ट डीएओ 3.6 ऑब्जेक्ट लाइब्रेरी में है?

क्या आप शायद एक्सेल 2010 के 64-बिट संस्करण का उपयोग कर रहे हैं (फ़ाइल-> माइक्रोसॉफ्ट एक्सेल के बारे में 'अनुभाग में सहायता करें)? यदि ऐसा है तो पुराने संस्करण डीएओ पुस्तकालय काम नहीं करेंगे, और आपको 64-बिट एसीई डीएओ लाइब्रेरी स्थापित करने की आवश्यकता होगी, जो कि 64-बिट के लिए उपलब्ध है।

+0

मैं वास्तव में दूरस्थ सर्वर के माध्यम से फ़ाइल चला रहा हूं। हालांकि मैं 3.6 लाइब्रेरी को ढूंढूंगा। अंततः कोड को डेटाबेस की प्रतिलिपि बनाना चाहिए और इसे वर्कशीट में रखना चाहिए, है ना? – thebiglebowski11

+1

यह मेरी मशीन पर काम करता है। मैंने एक टेबल के साथ एक नया। एमडीबी बनाया, अपने कोड को एक नई वर्कबुक में चिपकाया, टूल्स-> डीएओ 3.6 के संदर्भ में, डीबीफुलनाम पथ बदल दिया और यह काम किया। – Govert

3

डीएओ और एडीओ दोनों में रिकॉर्डसेट ऑब्जेक्ट प्रकार शामिल हैं। हालांकि वे संगत नहीं हैं। rs ऑब्जेक्ट वेरिएबल के लिए आपकी घोषणा संदिग्ध है।

Dim db As DAO.Database, rs As Recordset 

एक संभावित समस्या यह है कि अगर अपनी परियोजना एडीओ के लिए एक संदर्भ भी शामिल है, और उस संदर्भ की पूर्वता अपने डीएओ संदर्भ से ऊपर है, rs एक डीएओ recordset कोई ADO recordset के बजाय के रूप में हवा जाएगा।

मुझे यकीन नहीं है कि यह आपके द्वारा देखी जा रही त्रुटि का कारण है। हालांकि rs से db.OpenRecordset(something) को विफल करना चाहिए यदि आरएस एक एडीओ रिकॉर्डसेट है क्योंकि OpenRecordset एक डीएओ रिकॉर्डसेट देता है।

मुझे लगता है कि आप इस के लिए घोषणा बदलना चाहिए:

Dim db As DAO.Database, rs As DAO.Recordset 

यहां तक ​​कि अगर है कि परिवर्तन आपकी समस्या का समाधान नहीं होता है, मैं तुम्हें करने के लिए प्रोत्साहित हमेशा जब recordset वस्तु चर घोषित प्रकार अर्हता प्राप्त ... अस्पष्टता से बचने के लिए।

और यदि यह ठीक नहीं है, तो कृपया हमें बताएं कि आपके कोड की कौन सी रेखा आपके द्वारा देखे जा रहे वर्तमान त्रुटि को ट्रिगर करती है।

Dim TargetRande As String 

बाद में तुम हो:

Set TargetRange = Range("A1") 

अपने मॉड्यूल की घोषणाओं अनुभाग के लिए Option Explict जोड़े

यहाँ एक और लाल झंडा है। फिर डीबीयूजी-> वीबी संपादक के मुख्य मेनू से संकलित करें चुनें। यह प्रयास गलत वर्तनी वाले चर नामों को हाइलाइट करेगा, और सिंटैक्स त्रुटियों के लिए आपको चेतावनी देगा।