2013-03-29 4 views
7

तक पहुंचने के लिए एक्सेल से नया रिकॉर्ड अपडेट/बनाने के लिए वीबीए कोड मैं उत्तर के लिए हर जगह देखने की कोशिश कर रहा हूं, लेकिन वीबीए में मेरे निम्न आधारित कौशल वास्तव में मुझे यह समझने में मदद नहीं कर रहे हैं कि मैं कोड को आजमाने की कोशिश कर रहा हूं।एक्सेल से

मैं इस कोड अब तक है:

Sub ADOFromExcelToAccess() 
' exports data from the active worksheet to a table in an Access database 
' this procedure must be edited before use 
Dim cn As ADODB.Connection, rs As ADODB.Recordset, r As Long 
' connect to the Access database 
Set cn = New ADODB.Connection 
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & _ 
    "Data Source=\\GSS_Model_2.4.accdb;" 
' open a recordset 
Set rs = New ADODB.Recordset 
rs.Open "Forecast_T", cn, adOpenKeyset, adLockOptimistic, adCmdTable 
' all records in a table 
For i = 4 To 16 
    x = 0 
    Do While Len(Range("E" & i).Offset(0, x).Formula) > 0 
' repeat until first empty cell in column A 
     With rs 
      .AddNew ' create a new record 
      .Fields("Products") = Range("C" & i).Value 
      .Fields("Mapping") = Range("A1").Value 
      .Fields("Region") = Range("B2").Value 
      .Fields("ARPU") = Range("D" & i).Value 
      .Fields("Quarter_F") = Range("E3").Offset(0, x).Value 
      .Fields("Year_F") = Range("E2").Offset(0, x).Value 
      .Fields("Units_F") = Range("E" & i).Offset(0, x).Value 
      .Update 
     ' stores the new record 
    End With 
    x = x + 1 
    Loop 
Next i 
rs.Close 
Set rs = Nothing 
cn.Close 
Set cn = Nothing 
End Sub 

इस कोड को बिल्कुल वही करती मैं अब तक क्या चाहते हैं। मुझे पता है कि यह रिकॉर्ड देखने के लिए जा रहा है कि रिकॉर्ड 4 नियमों के आधार पर मौजूद है या नहीं: उत्पाद, क्षेत्र, क्वार्टर_एफ और वर्ष_एफ यदि यह इनसे मेल खाता है, तो इसे अन्य फ़ील्ड (यूनिट्स_एफ, एआरपीयू) अपडेट करना चाहिए। यदि नहीं, तो इसे कोड को ठीक से चलाना चाहिए और एक नया रिकॉर्ड बनाना चाहिए।

आपकी मदद की बहुत सराहना की जाएगी, मैं यहां फंस गया हूं और बाहर नहीं निकलता हूं।

आप

उत्तर

0

धन्यवाद इस लिखने मैं सिर्फ महसूस किया कि आप उपयोग कर रहे VBA तो मेरा उत्तर काम नहीं करेगा करने के बाद। लेकिन आप क्या चल रहा है का पालन करने में सक्षम होना चाहिए। हालांकि विचार यहाँ है। और VBA संग्रह के लिए इस पर एक नजर है:

VBA Collections

// First build your list 
    Dim myRecords As New Collection 

    For i = 4 To 16 
    x = 0 
    Do While Len(Range("E" & i).Offset(0, x).Formula) > 0 

       var list = from t in myRecords 
          where t.Products == Range("C" & i).Value 
          && t.Region == Range("B2").Value 
          && t.Quarter == Range("E3").Offset(0, x).Value 
          && t.Year == Range("E2").Offset(0, x).Value 
          select t; 

       var record = list.FirstOrDefault(); 

       if (record == null) 
       { 
        // a record with your key doesnt exist yet. this is a new record so add a new one to the list 
        record = new CustomObject(); 
        record.Products = Range("C" & i).Value; 
        // etc. fill in the rest 

        myRecords.Add(record); 
       } 
       else 
       { 
        // we found this record base on your key, so let's update 
        record.Units += Range("E" & i).Offset(0, x).Value;     
       } 

    x = x + 1 
    Loop 
Next i 

       // Now loop through your custom object list and insert into database 
+0

आपके उत्तर के लिए धन्यवाद, मैं समझता हूं कि आप यह कैसे करते हैं लेकिन मैं वास्तव में उन आदेशों को याद कर रहा हूं जिन्हें इसे वीबीए में करने के लिए उपयोग करने की आवश्यकता है ... यदि कोई जानता है, तो मुझे भी आपसे सुनकर खुशी होगी । – user2225351

+0

पिछली बार मैंने जांच की कि LINQ VBA में उपयोग नहीं किया जा सका – MattE

6

मैं निम्न डेटा सेल में शुरू होने वाले A1

product variety price 
bacon regular 3.79 
bacon premium 4.89 
bacon deluxe 5.99 

मैं एक तालिका नाम दिया "pricelist" के साथ एक Excel स्प्रेडशीट है मेरे एक्सेस डेटाबेस में जिसमें निम्न डेटा

product variety price 
------- ------- ----- 
bacon premium 4.99 
bacon regular 3.99 

अनुयायी है कारण एक्सेल VBA "नियमित" और "प्रीमियम" के लिए नए मूल्यों के साथ मौजूदा पहुँच रिकॉर्ड अपडेट करेगा, और "डीलक्स" के लिए तालिका में एक नई पंक्ति जोड़ना:

Public Sub UpdatePriceList() 
Dim cn As ADODB.Connection, rs As ADODB.Recordset 
Dim sProduct As String, sVariety As String, cPrice As Variant 
' connect to the Access database 
Set cn = New ADODB.Connection 
cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; " & _ 
    "Data Source=C:\Users\Gord\Desktop\Database1.accdb;" 
' open a recordset 
Set rs = New ADODB.Recordset 
rs.Open "PriceList", cn, adOpenKeyset, adLockOptimistic, adCmdTable 

Range("A2").Activate ' row 1 contains column headings 
Do While Not IsEmpty(ActiveCell) 
    sProduct = ActiveCell.Value 
    sVariety = ActiveCell.Offset(0, 1).Value 
    cPrice = ActiveCell.Offset(0, 2).Value 

    rs.Filter = "product='" & sProduct & "' AND variety='" & sVariety & "'" 
    If rs.EOF Then 
     Debug.Print "No existing record - adding new..." 
     rs.Filter = "" 
     rs.AddNew 
     rs("product").Value = sProduct 
     rs("variety").Value = sVariety 
    Else 
     Debug.Print "Existing record found..." 
    End If 
    rs("price").Value = cPrice 
    rs.Update 
    Debug.Print "...record update complete." 

    ActiveCell.Offset(1, 0).Activate ' next cell down 
Loop 
rs.Close 
Set rs = Nothing 
cn.Close 
Set cn = Nothing 
End Sub 
0

मैं करने के लिए पर्याप्त प्रतिष्ठा नहीं है उपरोक्त उत्तरों में से एक पर बस टिप्पणी करें। समाधान उत्कृष्ट था, लेकिन यदि आपके पास एक पंक्ति में रिकॉर्ड्स का एक टन है तो लूप को सब कुछ एक लूप में संलग्न करना आसान हो सकता है। मेरे पास Excel डेटा में भी मेरा डेटा था (लेकिन यदि आपके पास अभी एक गैर गतिशील रेंज है तो इसके बजाय एक श्रेणी के रूप में दर्ज करें)।

Set LO = wb.Worksheets("Sheet").ListObjects("YOUR TABLE NAME") 
rg = LO.DataBodyRange 
'All of the connection stuff from above that is excellent 
For x = LBound(rg) To UBound(rg) 

'Note that first I needed to find the row in my table containing the record to update 
'And that I also got my user to enter all of the record info from a user form 
'This will mostly work for you regardless, just get rid of the L/Ubound and search 
'Your range for the row you will be working on 

    If rg(x,1) = Me.cmbProject.Value Then 
     working_row = x 
     Exit For 
    End If 
Next 
For i = 2 To 17 ' This would be specific to however long your table is, or another range 
'argument would work just as well, I was a bit lazy here 
    col_names(i-1) = LO.HeaderRowRange(i) 'Write the headers from table into an array 
    Data(i-1) = Me.Controls("Textbox" & i).Value 'Get the data the user entered 
Next i 
'Filter the Access table to the row you will be entering the data for. I didn't need 
'Error checking because users had to select a value from a combobox 
rst.Filter = "[Column Name] ='" & "Value to filter on (for me the combobox val)" 
For i = 1 To 16 'Again using a len(Data) would work vs. 16 hard code 
    rst(col_names(i)).Value = Data(i) 
Next i 

यह है कि - तो मैं सिर्फ डेटाबेस/कनेक्शन आदि बंद कर दिया और मेरे उपयोगकर्ता संदेश डेटा कह में लिखा गया था दी

ही बात तुम सच में यहाँ ध्यान दें करने की आवश्यकता है है मेरी। उपयोगकर्ताफॉर्म नहीं है (अभी तक) डेटा प्रकार की जांच शामिल है, लेकिन यह मेरा अगला कोड है। अन्यथा आप इसे खोलने पर एक्सेस या कुछ वाकई खराब दिखने वाले डेटा से अपवाद प्राप्त कर सकते हैं!

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