2016-08-05 6 views
5

से तालिका मान अपडेट करें मेरे पास एक तालिका के साथ एक कार्यपुस्तिका है जो आकार में लगभग 20000 पंक्तियां और 52 कॉलम है। कभी-कभी, मुझे एक बार में चुनिंदा पंक्तियों का प्रतिशत अपडेट करना होगा। मैं पंक्ति में किसी मान के आधार पर चुनिंदा कोशिकाओं को अद्यतन करने के लिए मैक्रो का उपयोग करने की उम्मीद कर रहा हूं, तालिका में दर्ज किए जाने वाले अद्यतन मानों के साथ दूसरी छोटी तालिका द्वारा मैप किया गया है। लगभग एक VLOOKUP फ़ंक्शन की तरह, लेकिन जो कोई नहीं करता प्रविष्टि नहीं मिली है तो सेल मिटा नहीं है। उदाहरण के लिए, होस्ट आईडी के अनुसार फोन नंबर बदलें।किसी अन्य तालिका

मैंने तालिका 1 में मानों के एक specfic सेट के लिए नीचे दिए गए कोड में एक ऐरे के साथ ऐसा करने का प्रयास किया, लेकिन मेरे मान अपडेट नहीं हुए। मेरा वीबीए थोड़ा जंगली है, इसलिए अगर कोई इसे काम करने के लिए समीक्षा और सहायता कर सकता है, तो इसकी सराहना की जाएगी। मैं इसे टेबल हेडर के आधार पर तालिका में किसी प्रविष्टि को अपडेट करना चाहता हूं।

Sub NewNameandCostCenter() 
Dim myList, myRange 
Dim sht As Worksheet 
Dim sht2 As Worksheet 
Dim LastRow As Long 
Dim LastColumn As Long 
Dim StartCell As Range 
Dim LastRow2 As Long 
Set sht = Worksheets("NewNameMacro") 
Set sht2 = Worksheets("ALL") 
Set StartCell = Range("A2") 

'Find Last Row and Column 
    LastRow = sht.Cells(sht.Rows.Count, StartCell.Column).End(xlUp).Row 
    LastColumn = sht.Cells(StartCell.Row, sht.Columns.Count).End(xlToLeft).Column 
'set myList array 
Set myList = sht.Range(StartCell, sht.Cells(LastRow, LastColumn)) 
LastRow2 = sht.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row 
'set myRange array 
Set myRange = Sheets("ALL").Range("J2:M" & LastRow2) 
'Update values of cells adjacent 
For Each cel In myList.Columns(1).Cells 
myRange.Replace What:=cel.Value, Replacement:=cel.Offset(0, 1).Value, LookAt:=xlWhole 
myRange.Replace What:=cel.Value, Replacement:=cel.Offset(0, 2).Value, LookAt:=xlWhole 
myRange.Replace What:=cel.Value, Replacement:=cel.Offset(0, 3).Value, LookAt:=xlWhole 
Next cel 
End Sub 

धन्यवाद, जद

उत्तर

0

अगर मैं अपने प्रश्न समझ में सही ढंग से, आप प्रभावी रूप से अपने डेटा, अपने मानचित्रण तालिका में मूल्यों पर आधारित खिलाफ एक अद्यतन क्वेरी चला रहे हैं।

  • "कुंजी" कॉलम आपके मानचित्रण तालिका में अपना डेटा तालिका और में पहले स्तंभ है:

    मैं निम्नलिखित मान लिया गया है।

  • अपने मानचित्रण तालिका में कॉलम उसी क्रम और डेटा तालिका में स्तंभों के रूप में रिश्तेदार की स्थिति में हैं (हालांकि यह आसानी से समायोजित किया जा सकता है।

  • मानचित्रण मेज और में चाबियों का आदेश डेटा तालिका अवर्गीकृत है। आप यह सुनिश्चित कर सकते हैं कि चाबी हल कर रहे हैं (आदर्श दोनों शीट में), तो आप कुछ मामूली परिवर्तनों के साथ काफी हद तक अपना प्रदर्शन सुधार सकता है।

मैं में पर्वतमाला हार्ड-कोडेड किया है मेरी उदाहरण के लिए, लेकिन यदि आपको आवश्यकता है तो आप अंतिम पंक्ति और अंतिम कॉलम दृष्टिकोण को पुनर्स्थापित कर सकते हैं।

मैंने श्रेणियों के बजाय सरणी के बीच मेरी सभी तुलना की है, और मैंने खोज दृष्टिकोण से दूर कर लिया है। आप पाएंगे कि यह काम करता है, और अधिक कुशलता से काम करता है।

50 of 20000 rows updated in 0.23828125 seconds

लेकिन अगर आप पंक्तियों के हजारों को अद्यतन करने शुरू करने की आवश्यकता है, तो आप यह सुनिश्चित करना डेटा सॉर्ट हो जाता है और सुधार करने से काफी लाभ होगा:

Option Explicit 

Sub NewNameandCostCenter() 

    Dim start As Double 
    start = Timer 

    Dim countOfChangedRows As Long 

    'set rngMap array 
    Dim rngMap As Range 
    Set rngMap = Worksheets("Map").Range("A1:D51") 

    'set rngData array 
    Dim rngData As Range 
    Set rngData = Worksheets("Data").Range("J2:M20001") 

    Dim aMap As Variant 
    aMap = rngMap.Value 

    Dim aData As Variant 
    aData = rngData.Value 

    Dim mapRow As Long 
    Dim datarow As Long 
    Dim mapcol As Long 

    For mapRow = LBound(aMap, 1) To UBound(aMap, 1) 
    For datarow = LBound(aData) To UBound(aData) 
     'Check the key matches in both tables 
     If aData(datarow, 1) = aMap(mapRow, 1) Then 
     countOfChangedRows = countOfChangedRows + 1 
     'Assumes the columns in map and data match 
     For mapcol = LBound(aMap, 2) + 1 To UBound(aMap, 2) 
      aData(datarow, mapcol) = aMap(mapRow, mapcol) 
     Next mapcol 
     End If 
    Next datarow 
    Next mapRow 

    rngData.Value = aData 

    Debug.Print countOfChangedRows & " of "; UBound(aData, 1) & " rows updated in " & Timer - start & " seconds" 

End Sub 

प्रदर्शन 50 अद्यतन पंक्तियों के लिए उचित है तदनुसार कोड।

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