2012-08-08 17 views
6

से डुप्लिकेट निकालने के कोई कैसे निम्नलिखित समस्या को हल करने के लिए के रूप में मुझे कुछ संकेत दे सकता है:VBA, सरणी

मान लें मैं Excel 2010 में डेटा का एक ब्लॉक, 3 कॉलम के आधार पर 100 पंक्तियों की है।

कॉलम सी, कुछ डुप्लिकेट शामिल कहते हैं कि यह 1,1,1 2,3,4,5, ..... के रूप में शुरू होता है, 97,98

VBA का उपयोग करना, मैं निकालना चाहते हैं कॉलम सी के अनुसार, डुप्लिकेट पंक्तियां, ताकि मुझे 1,2,3, ....., 97, 98, यानी केवल 98 पंक्तियां और 3 कॉलम के साथ छोड़ा जा सके।

मुझे पता है कि एक ऐसा बटन है जिसे मैं एक्सेल 2010 में क्लिक कर सकता हूं, लेकिन मैं इसे वीबीए में करना चाहता हूं (क्योंकि मैंने इसे आजमाया है और किसी कारण से, मेरे बाद के बाकी कोड के साथ पूर्णांक देता है और गलत देता है परिणाम)।

इसके अलावा, मैं

ऐसे Application.Worksheetfunction.countif (के रूप में तरीकों की तुलना में सरणियों में यह करने के लिए है, तो कार्यपत्रक पर परिणाम पेस्ट, बल्कि ..... चाहते हैं तो कुछ इस तरह:

Dim myarray() as Variant 
myarray=cells(1,1).Currentregion.value 

Dim a as Long 

For a=1 to Ubound(myarray,1) 

    'something here to 

Next a 

उत्तर

5

I answered a similar question यहाँ कोड मैं प्रयोग किया जाता है:

Dim dict As Object 
Dim rowCount As Long 
Dim strVal As String 

Set dict = CreateObject("Scripting.Dictionary") 

rowCount = Sheet1.Range("A1").CurrentRegion.Rows.Count 

'you can change the loop condition to iterate through the array rows instead 
Do While rowCount > 1 
    strVal = Sheet1.Cells(rowCount, 1).Value2 

    If dict.exists(strVal) Then 
    Sheet1.Rows(rowCount).EntireRow.Delete 
    Else 
    'if doing this with an array, then add code in the Else block 
    ' to assign values from this row to the array of unique values 
    dict.Add strVal, 0 
    End If 

    rowCount = rowCount - 1 
Loop 

Set dict = Nothing 

आप एक सरणी है, तो एक ही सशर्त साथ तत्वों के माध्यम से लूप उपयोग करना चाहते हैं (यदि/बाकी) सेंट atements। यदि आइटम शब्दकोश में मौजूद नहीं है, तो आप इसे शब्दकोश में जोड़ सकते हैं और पंक्ति मान को किसी अन्य सरणी में जोड़ सकते हैं।

ईमानदारी से, मुझे लगता है कि मैक्रो रिकॉर्डर से प्राप्त कोड को अनुकूलित करने का सबसे प्रभावी तरीका है। आप एक पंक्ति में ऊपर समारोह में प्रदर्शन कर सकते हैं:

Sheet1.UsedRange.RemoveDuplicates Columns:=3, Header:=xlYes 
+2

यह शीट से वास्तविक पंक्तियों को हटा देता है, जबकि सवाल वीबीए में डुप्लिकेट को हटाना था।साथ ही पंक्तियों को छोड़ने से बचने के लिए किसी पंक्ति पंक्ति को हमेशा नीचे से नीचे जाना चाहिए, – brettdj

+0

@brettdj कोड के दोनों बिट डुप्लिकेट को हटाने के लिए काम करेंगे। पूछताछ वीबीए में करना चाहता था, अधिमानतः सरणी के साथ (जिस स्थिति में वह आसानी से लूप को एक सीमा के बजाय सरणी की पंक्तियों के माध्यम से फिर से संशोधित करने के लिए संशोधित कर सकता है, फिर एक अलग सरणी में केवल अद्वितीय तत्व जोड़ें)। यदि आप कोड को देखते हैं, तो आप देखेंगे कि पंक्ति हटाना नीचे से ऊपर जाता है ('पंक्ति गणना' घट जाती है)। :) – Zairja

+0

वैसे सवाल शीर्षक * वीबीए है, सरणी * से डुप्लिकेट हटा दें। आप एक अच्छा मुद्दा बनाते हैं कि आपका कोड 'काउंटर' का उपयोग करने के तरीके से नीचे जाता है हालांकि इस मामले में पूछताछ करने वाले को यह निर्दिष्ट करने की आवश्यकता हो सकती है कि पहली घटना शीर्ष या बोतल पर रखी जानी चाहिए या नहीं। – brettdj

0

शब्दकोश 255 मदों की एक अधिकतम है, तो आप एक संग्रह का उपयोग करने की जरूरत है अगर आप अधिक मान हैं। दुर्भाग्यवश, संग्रह ऑब्जेक्ट में कोई नहीं है। (ए) या .इक्सिस्ट (ए) विधि, लेकिन यह फ़ंक्शन त्रुटि संख्याओं का उपयोग करके इसे अच्छी तरह से संभालता है (

सुधार: शब्दकोशों में ऐसा कोई नहीं है सीमा (धन्यवाद ज़ैरजा)। हो सकता है कि मैं अपने शब्दकोश के माध्यम से पुन: प्रयास करने के लिए एक इंटीजर का उपयोग कर रहा हूं।

CollContainsItem(col As Collection, val As Variant) As Boolean 

Dim itm As Variant 
On Error Resume Next 

    itm = col.Item(val) 
    CollContainsItem = Not (Err.Number = 5 Or Err.Number = 9) 

On Error GoTo 0 

End Function 

तो अगर आप एक संग्रह की जरूरत है, आप की संभावना सिर्फ

की जगह सकता है: जो भी हो, इस समारोह आप आइटम अस्तित्व के लिए संग्रह की जाँच करने के, तो मैं इसे यहाँ छोड़ देंगे अगर यह किसी के लिए उपयोगी है की अनुमति देता है
dict.Exists(strVal) 

CollContainsItem(coll, strVal) 

साथ

और की जगह

Set dict = CreateObject("Scripting.Dictionary") 

Set coll = CreateObject("Scripting.Collection") 

और Zairja के कोड के बाकी का उपयोग के साथ

। (मैंने वास्तव में इसे आजमाया नहीं है लेकिन यह करीब होना चाहिए)

+2

वास्तव में, 'शब्दकोश' वस्तु 255 आइटम तक सीमित नहीं है। यह केवल डीबगर शो के आइटम की अधिकतम संख्या है। मेरा मानना ​​है कि यह केवल स्मृति द्वारा ही सीमित है (मैं एक्सेल 2010 का उपयोग कर रहा हूं, लेकिन 2003 संस्करण में मैं कुछ सौ हजार तत्वों के साथ शब्दकोश प्राप्त करने में सक्षम था)। इसके अतिरिक्त, आप यह सुनिश्चित करना चाहते हैं कि यदि आप किसी प्रकार के वृद्धि चर का उपयोग कर रहे हैं तो सुनिश्चित करें कि यह 'लांग' है और 'इंटीगर' नहीं है (जो 256 पर रुक जाएगा)। – Zairja

+0

ओह, क्या एक्सेल का पूर्णांक केवल 256 पर जाता है ?? शायद यह सब मेरी समस्या थी! –

3
Function eliminateDuplicate(poArr As Variant) As Variant 
Dim poArrNoDup() 

    dupArrIndex = -1 
For i = LBound(poArr) To UBound(poArr) 
     dupBool = False 

     For j = LBound(poArr) To i 
      If poArr(i) = poArr(j) And Not i = j Then 
       dupBool = True 
      End If 
     Next j 

     If dupBool = False Then 
      dupArrIndex = dupArrIndex + 1 
      ReDim Preserve poArrNoDup(dupArrIndex) 
      poArrNoDup(dupArrIndex) = poArr(i) 
     End If 
Next i 

eliminateDuplicate = poArrNoDup 
End Function 
+0

यदि कोड में कोई समस्या है, तो टिप्पणी करें और उन्हें बताएं कि कृपया [इस संशोधन] [http://stackoverflow.com/revisions/19693896/2) में अन्य SO उपयोगकर्ता उत्तरों को संपादित न करें। – Lankymart

+0

मुझे प्रत्येक लूप के लिए डुप्लूल को गलत पर सेट करने की आवश्यकता है – 99moorem