2008-11-11 16 views
5

मान लीजिए कि मैं नीचे की तरह एक एक्सेल फैल शीट डालते हैं:लूप का उपयोग किये बिना वीबीए में कोशिकाओं की एक श्रृंखला कैसे वापस करें?

 
col1 col2 
------------ 
dog1 dog 
dog2 dog 
dog3 dog 
dog4 dog 
cat1 cat 
cat2 cat 
cat3 cat 

मैं या तो "कुत्ते के आधार पर कक्षों की श्रेणी (dog1, dog2, dog3, dog4) या (cat1, cat2, CAT3) वापस करना चाहते "या" बिल्ली "

मुझे पता है कि मैं एक-एक करके जांचने के लिए एक लूप कर सकता हूं, लेकिन क्या वीबीए में कोई अन्य तरीका है ताकि मैं परिणाम को एक शॉट में" फ़िल्टर "कर सकूं?

शायद रेंज। ढूँढें (XXX) मदद कर सकता है, लेकिन मैं केवल कोशिकाओं की एक श्रृंखला नहीं बल्कि केवल एक सेल के उदाहरण देखता हूं।

सलाह कृपया

सादर

+0

आपके द्वारा पोस्ट किया गया उदाहरण बहुत अजीब लग रहा है, कृपया इसे बदलें ताकि यह पठनीय हो। – schnaader

+0

यह एक स्पेसबार मुद्दा नहीं है। वह एक अजीब चरित्र सेट या कुछ का उपयोग कर रहा है। –

+0

और यह केवल उनके कुछ पाठों पर दिखाई देता है? – FlySwat

उत्तर

0

धन्यवाद डीजे।

कि FindAll समाधान अभी भी चीजों को करने के लिए एक वीबीए पाश का उपयोग करता है।

मैं एक्सेल वीबीए में एक श्रेणी को फ़िल्टर करने के लिए उपयोगकर्ता स्तर लूप का उपयोग किए बिना एक रास्ता खोजने की कोशिश कर रहा हूं।

यहां मुझे एक समाधान मिला। यह नौकरी करने के लिए एक्सेल अंतर्निहित इंजन का लाभ उठाता है।

(1) का उपयोग worksheetfunction.CountIf (, "कैट") "बिल्ली" कोशिकाओं की गणना प्राप्त करने में

(2) .Find ("बिल्ली") का उपयोग "बिल्ली की पहली पंक्ति में प्राप्त करने के लिए "

पंक्तियों और पहली पंक्ति की गिनती के साथ, मैं पहले से ही" बिल्ली "रेंज प्राप्त कर सकता हूं।

इस समाधान का अच्छा हिस्सा यह है: कोई उपयोगकर्ता-स्तरीय पाश नहीं है, यदि सीमा बड़ी है तो यह प्रदर्शन में सुधार कर सकती है।

+0

मैंने यह भी पाया है कि एक बड़ी रेंज के माध्यम से लूपिंग के लिए प्रदर्शन बहुत धीमा हो सकता है। हालांकि, अगर आप वीबीए का उपयोग कर रहे हैं और रेंज वैल्यू को पहले एरे में बदलते हैं और फिर लूप, तो आप बड़े प्रदर्शन को बढ़ावा दे सकते हैं। भले ही आपको बाद में कनवर्ट करना पड़े। –

0

एक्सेल ओडीबीसी प्रोटोकॉल का समर्थन करता है। मुझे पता है कि आप एक एक्सेस डेटाबेस से एक्सेल स्प्रेडशीट से कनेक्ट कर सकते हैं और इसे पूछ सकते हैं। मैंने इसे नहीं किया है, लेकिन शायद एक्सेल के अंदर से ओडीबीसी का उपयोग करके स्प्रेडशीट से पूछने का एक तरीका है।

0

जब तक आप एक वेरीरी पुरानी मशीन का उपयोग नहीं कर रहे हैं, या आपके पास एक बाज़िलियन पंक्तियों के साथ XL2007 वर्कशीट है, तो एक लूप पर्याप्त तेज़ होगा। ईमानदार!

मुझ पर भरोसा मत करो? इसे देखो। मैं इस का उपयोग करते हुए यादृच्छिक पत्र के साथ एक लाख पंक्ति रेंज भरा:

=CHAR(RANDBETWEEN(65,90)) 

तो मैं इस समारोह में लिखा था और का उपयोग कर एक 26 कक्ष श्रेणी से यह कहा जाता है नियंत्रण-Shift-दर्ज करें:

=TRANSPOSE(UniqueChars(A1:A1000000)) 

यहाँ नहीं-बहुत-अनुकूलित VBA समारोह मैं कुछ मिनटों के बाहर काट दिया:

Option Explicit 

Public Function UniqueChars(rng As Range) 

Dim dict As New Dictionary 
Dim vals 
Dim row As Long 
Dim started As Single 

    started = Timer 

    vals = rng.Value2 

    For row = LBound(vals, 1) To UBound(vals, 1) 
     If dict.Exists(vals(row, 1)) Then 
     Else 
      dict.Add vals(row, 1), vals(row, 1) 
     End If 
    Next 

    UniqueChars = dict.Items 

    Debug.Print Timer - started 

End Function 

मेरी वर्षीय कोर पर 2 डुओ T7300 (2GHz) लैपटॉप यह 0.58 सेकंड लिया।

1

एक और XL2007 सुविधा भूल गए: उन्नत फ़िल्टरिंग।आप VBA में यह चाहते हैं, मैं एक रिकॉर्ड मैक्रो से मिला:

Range("A1:A1000000").AdvancedFilter Action:=xlFilterCopy, CopyToRange:= Range("F1"), Unique:=True 

मैं इसे 0.35 के बारे में सेकंड में समय समाप्त हो गया ...

वैसे, बहुत ज्यादा नहीं उपयोग करता है, तो आप 2007

की जरूरत नहीं है
2

रेंज वापस करने के लिए एक रिकॉर्डसेट का उपयोग करने के कुछ नोट यहां दिए गए हैं।

Sub GetRange() 
Dim cn As Object 
Dim rs As Object 
Dim strcn, strFile, strPos1, strPos2 

    Set cn = CreateObject("ADODB.Connection") 
    Set rs = CreateObject("ADODB.Recordset") 

    strFile = ActiveWorkbook.FullName 

    strcn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ 
    & strFile & ";Extended Properties='Excel 8.0;HDR=Yes;IMEX=1';" 

    cn.Open strcn 

    rs.Open "SELECT * FROM [Sheet1$]", cn, 3 'adOpenStatic' 

    rs.Find "Col2='cat'" 
    strPos1 = rs.AbsolutePosition + 1 
    rs.MoveLast 
    If Trim(rs!Col2 & "") <> "cat" Then 
     rs.Find "Col2='cat'", , -1 'adSearchBackward' 
     strPos2 = rs.AbsolutePosition + 1 
    Else 
     strPos2 = rs.AbsolutePosition + 1 
    End If 
    Range("A" & strPos1, "B" & strPos2).Select 
End Sub 
संबंधित मुद्दे

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