2013-04-23 7 views
19

पर डेटा निर्यात करने के लिए एक्सेल वीबीए का उपयोग कर मैं वर्तमान में वर्कशीट से एमएस एक्सेस डेटाबेस में डेटा निर्यात करने के लिए निम्नलिखित कोड का उपयोग कर रहा हूं, कोड प्रत्येक पंक्ति के माध्यम से लूपिंग कर रहा है और एमएस एक्सेस टेबल में डेटा डालने वाला है।एमएस एक्सेस टेबल

Public Sub TransData() 

Application.ScreenUpdating = False 
Application.EnableAnimations = False 
Application.EnableEvents = False 
Application.DisplayAlerts = False 

ActiveWorkbook.Worksheets("Folio_Data_original").Activate 

Call MakeConnection("fdMasterTemp") 

For i = 1 To rcount - 1 
    rs.AddNew 
    rs.Fields("fdName") = Cells(i + 1, 1).Value 
    rs.Fields("fdDate") = Cells(i + 1, 2).Value 
    rs.Update 

Next i 

Call CloseConnection 

Application.ScreenUpdating = True 
Application.EnableAnimations = True 
Application.EnableEvents = True 
Application.DisplayAlerts = True 

End Sub 

Public Function MakeConnection(TableName As String) As Boolean 
'*********Routine to establish connection with database 

    Dim DBFullName As String 
    Dim cs As String 

    DBFullName = Application.ActiveWorkbook.Path & "\FDData.mdb" 

    cs = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";" 

    Set cn = CreateObject("ADODB.Connection") 

    If Not (cn.State = adStateOpen) Then 
     cn.Open cs 
    End If 

    Set rs = CreateObject("ADODB.Recordset") 

    If Not (rs.State = adStateOpen) Then 
     rs.Open TableName, cn, adOpenKeyset, adLockOptimistic 
    End If 

End Function 

Public Function CloseConnection() As Boolean 
'*********Routine to close connection with database 

On Error Resume Next 
    If Not rs Is Nothing Then 
     rs.Close 
    End If 


    If Not cn Is Nothing Then 
     cn.Close 
    End If 
    CloseConnection = True 
    Exit Function 

End Function 

कोड से ऊपर रिकॉर्ड के कुछ सौ लाइनों के लिए ठीक काम करता है, लेकिन जाहिरा तौर पर यह 25000 के रिकॉर्ड की तरह, निर्यात करने के लिए और अधिक डेटा हो जाएगा, यह संभव है सभी रिकॉर्ड्स के माध्यम से लूपिंग के बिना निर्यात और केवल एक एसक्यूएल इंसर्ट स्टेटमेंट थोक में सभी डेटा डालने के लिए सुश्री एक्सेस टेबल में जाएं?

किसी भी मदद की बहुत सराहना की जाएगी।

संपादित करें: इस मुद्दे को हल

बस जानकारी है, तो किसी को भी इस बात के लिए करना चाहता है के लिए, मैं खोज की एक बहुत किया है और मेरे लिए काम ठीक हो के लिए निम्न कोड पाया, और यह असली तेजी की वजह से है एसक्यूएल सम्मिलित करें, (सिर्फ 3 सेकंड में 27,648 रिकॉर्ड !!!!):

Public Sub DoTrans() 

    Set cn = CreateObject("ADODB.Connection") 
    dbPath = Application.ActiveWorkbook.Path & "\FDData.mdb" 
    dbWb = Application.ActiveWorkbook.FullName 
    dbWs = Application.ActiveSheet.Name 
    scn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dbPath 
    dsh = "[" & Application.ActiveSheet.Name & "$]" 
    cn.Open scn 

    ssql = "INSERT INTO fdFolio ([fdName], [fdOne], [fdTwo]) " 
    ssql = ssql & "SELECT * FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh 

    cn.Execute ssql 

End Sub 

फिर भी विशिष्ट क्षेत्रों को जोड़ने के लिए काम कर के बजाय का उपयोग कर "* का चयन करें" का नाम, क्षेत्र का नाम जोड़ने की विभिन्न तरीकों की कोशिश की लेकिन नहीं कर सकते यह अभी के लिए काम करता है।

+0

@Fionnuala कोड ADO..the CreateObject ("ADODB.Connection") 'SCN =" प्रदाता उपयोग कर रहा है एडीओ वस्तु .. – Ahmed

+1

एक .accdb फ़ाइल के लिए पैदा करेगा, का उपयोग करें = Microsoft.ACE.OLEDB। 12.0; डेटा स्रोत = "और dbpath' –

+0

संपादन को उत्तर के रूप में पोस्ट किया जाना चाहिए। मुझे लगता है कि यह एक्सेल से डेटा या VBA का उपयोग कर टेक्स्ट फ़ाइलों से स्थानांतरित करने का सबसे अच्छा तरीका है। एक्सेल के नए संस्करणों के लिए एक्सेल 12.0 एक्सएलएम/एक्सेल 12.0 में उदाहरण के लिए कनेक्शन स्ट्रिंग को अपडेट करने की आवश्यकता है। और एईसी प्रदाता पाठ्यक्रम के जेईटी के बराबर है। – L42

उत्तर

16

is it possible to export without looping through all records

पंक्तियों की एक बड़ी संख्या के साथ Excel में एक सीमा के लिए आप कुछ प्रदर्शन में सुधार देख सकते हैं यदि आप Excel में एक Access.Application वस्तु बनाने और उसके बाद आयात एक्सेल डेटा के लिए इसका इस्तेमाल एक्सेस में। नीचे दिए गए कोड एक ही एक्सेल दस्तावेज़ में एक VBA मॉड्यूल है जो निम्न परीक्षण डाटा

SampleData.png

Option Explicit 

Sub AccImport() 
    Dim acc As New Access.Application 
    acc.OpenCurrentDatabase "C:\Users\Public\Database1.accdb" 
    acc.DoCmd.TransferSpreadsheet _ 
      TransferType:=acImport, _ 
      SpreadSheetType:=acSpreadsheetTypeExcel12Xml, _ 
      TableName:="tblExcelImport", _ 
      Filename:=Application.ActiveWorkbook.FullName, _ 
      HasFieldNames:=True, _ 
      Range:="Folio_Data_original$A1:B10" 
    acc.CloseCurrentDatabase 
    acc.Quit 
    Set acc = Nothing 
End Sub 
+0

उत्तर के लिए धन्यवाद ... मैं इस कोड को आजमाउंगा और आपको बताएगा कि यह काम करता है .. – Ahmed

+0

मैंने कोड का उपयोग किया है और त्रुटि मिली है: "इंस्टॉल करने योग्य ISAM नहीं मिला" – Ahmed

+0

यह काम कर रहा है ... बस आयात प्रकार को 5 में बदलें ........ बहुत बड़ा धन्यवाद ..... .. :) – Ahmed

0

@Ahmed

नीचे शामिल है कोड है कि में प्रविष्टि के लिए नामांकित श्रेणी से खेतों को निर्दिष्ट करता है एमएस एक्सेस इस कोड के बारे में अच्छी बात यह है कि आप जो भी चाहें एक्सेल में अपने फ़ील्ड का नाम दे सकते हैं (यदि आप * का उपयोग करते हैं तो फ़ील्ड को एक्सेल और एक्सेस के बीच बिल्कुल मिलान करना होगा) जैसा कि आप देख सकते हैं कि मैंने एक्सेल कॉलम "हाहा" नाम दिया है भले ही एक्सेस कॉलम को "डीटीई" कहा जाता है।

Sub test() 
    dbWb = Application.ActiveWorkbook.FullName 
    dsh = "[" & Application.ActiveSheet.Name & "$]" & "Data2" 'Data2 is a named range 


sdbpath = "C:\Users\myname\Desktop\Database2.mdb" 
sCommand = "INSERT INTO [main] ([dte], [test1], [values], [values2]) SELECT [haha],[test1],[values],[values2] FROM [Excel 8.0;HDR=YES;DATABASE=" & dbWb & "]." & dsh 

Dim dbCon As New ADODB.Connection 
Dim dbCommand As New ADODB.Command 

dbCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sdbpath & "; Jet OLEDB:Database Password=;" 
dbCommand.ActiveConnection = dbCon 

dbCommand.CommandText = sCommand 
dbCommand.Execute 

dbCon.Close 


End Sub 
संबंधित मुद्दे