2015-02-18 15 views
9

मैं स्तंभ A में 8 चर, 1,2,3,4,5 और ए, बी, सीफिल्टर बाहर

मेरा उद्देश्य को फिल्टर करने की ए, बी, सी और केवल 1-5 प्रदर्शित करें।

मैं निम्नलिखित कोड का उपयोग कर ऐसा कर सकते हैं:

My_Range.AutoFilter Field:=1, Criteria1:=Array("1", "2", "3","4","5"), Operator:=xlFilterValues 

लेकिन क्या कोड करता है यह चर 1 से 5 फिल्टर और उन्हें प्रदर्शित करता है।

मैं विपरीत करने के लिए अभ्यस्त है, लेकिन एक ही परिणाम उपज, ए, बी, सी फ़िल्टर करने और 5

को चर 1 दिखा कर मैं इस कोड की कोशिश की:

My_Range.AutoFilter Field:=1, Criteria1:=Array("<>A", "<>B", "<>C"), Operator:=xlFilterValues 

लेकिन यह किया काम नहीं।

मैं इस कोड का उपयोग क्यों नहीं कर सकता?

run time error 1004 autofilter method of range class failed

मैं यह कैसे कर सकते हैं:

यह इस त्रुटि देता है?

+0

संभव डुप्लिकेट https://stackoverflow.com/questions/19497659/excel-vba-autofilter-all-but-three/35120033 ? एस = 1 | 66.2429 # 35,120,033) – Jeeped

उत्तर

13

मुझे लगता है कि (प्रयोग से - एमएसडीएन यहां अनुपयोगी है) कि ऐसा करने का कोई सीधा तरीका नहीं है। Criteria1 को Array पर सेट करना ड्रॉपडाउन में टिक बॉक्स का उपयोग करने के बराबर है - जैसा कि आप कहते हैं कि यह केवल उन वस्तुओं के आधार पर एक सूची फ़िल्टर करेगा जो सरणी में से किसी एक से मेल खाते हैं।

दिलचस्प है, अगर आप इन पर शाब्दिक मूल्यों "<>A" और सूची में "<>B" और फिल्टर है मैक्रो रिकॉर्डर

Range.AutoFilter Field:=1, Criteria1:="=<>A", Operator:=xlOr, Criteria2:="=<>B" 

जो काम करता है के साथ आता है। लेकिन यदि आपके पास शाब्दिक मूल्य "<>C" भी है और मैक्रो रिकॉर्ड करते समय आप तीनों (टिक बॉक्स का उपयोग करके) फ़िल्टर करते हैं, तो मैक्रो रिकॉर्डर ठीक से आपके कोड को दोहराता है जो तब त्रुटि के साथ विफल रहता है। मुझे लगता है कि मैं इसे एक बग कहूंगा - ऐसे यूआई का उपयोग कर आप फ़िल्टर कर सकते हैं जिन्हें आप वीबीए के साथ नहीं कर सकते हैं।

वैसे भी, आपकी समस्या पर वापस जाएं। यह मान कुछ मानदंड के बराबर नहीं है, लेकिन केवल दो मान जो आप के लिए काम नहीं करता है फिल्टर करने के लिए संभव है:

Range("$A$1:$A$9").AutoFilter Field:=1, Criteria1:="<>A", Criteria2:="<>B", Operator:=xlAnd 

संभावित समाधानों सटीक समस्या पर निर्भर करता है के एक जोड़े हैं:

  1. कॉलम बी में सूत्र के साथ "सहायक कॉलम" का उपयोग करें और फिर उस पर फ़िल्टर करें - उदाहरण के लिए =ISNUMBER(A2) या =NOT(A2="A", A2="B", A2="C") तो आप एक स्तंभ नहीं जोड़ सकते TRUE
  2. फ़िल्टर करते हैं, (या एक उपयुक्त संख्या में किसी भी आप उम्मीद से कम) Criteria1:=">-65535" साथ स्वत: फ़िल्टर जो को फ़िल्टर कर देगा का उपयोग गैर-अंकीय मान - यह मानते हुए कि आप क्या चाहते हैं
  3. है
  4. पंक्तियों को छिपाने के लिए एक वीबीए सब लिखें (बिल्कुल ऑटोफिल्टर के समान नहीं है लेकिन यह आपकी आवश्यकताओं के आधार पर पर्याप्त हो सकता है)।

उदाहरण के लिए: = xlAnd आपके मानदंड के बीच: ऑपरेटर के साथ = xlOr:

Public Sub hideABCRows(rangeToFilter As Range) 
    Dim oCurrentCell As Range 
    On Error GoTo errHandler 

    Application.ScreenUpdating = False 
    For Each oCurrentCell In rangeToFilter.Cells 
    If oCurrentCell.Value = "A" Or oCurrentCell.Value = "B" Or oCurrentCell.Value = "C" Then 
     oCurrentCell.EntireRow.Hidden = True 
    End If 
    Next oCurrentCell 

    Application.ScreenUpdating = True 
    Exit Sub 

errHandler: 
    Application.ScreenUpdating = True 
End Sub 
+0

आपको बहुत बहुत धन्यवाद। यह वही है जो मैं खोज रहा था, एक सूचनात्मक और शैक्षिक उत्तर। अच्छा काम जारी रखें। सब से –

-2

ऑपरेटर बदलें। = XlAnd, Criteria2: = 1, Criteria1: संशोधन स्क्रिप्ट

myRange.AutoFilter फील्ड नीचे देखें ऑपरेटर = "<> ए ', =" <> बी ", ऑपरेटर: = xlAnd, Criteria3: =" < > सी '

+0

पहले, मैं एक्सेल प्रलेखन सलाह ली और ऑटो फ़िल्टर समारोह नहीं Criteria3 पैरामीटर है! और 3 वां, 'ए', 'बी' और 'सी' केवल एक उदाहरण हैं; मुझे 3 से अधिक मूल्यों के साथ एक सरणी की आवश्यकता हो सकती है! – schlebe

0

मैं इंटरनेट पर किसी भी समाधान नहीं मिला है, इसलिए मैं एक को लागू किया है।

मानदंडों के साथ स्वत: फ़िल्टर कोड तो

iColNumber = 1 
Dim aFilterValueArray() As Variant 
Call ConstructFilterValueArray(aFilterValueArray, iColNumber, Array("A", "B", "C")) 

ActiveSheet.range(sRange).AutoFilter Field:=iColNumber _ 
    , Criteria1:=aFilterValueArray _ 
    , Operator:=xlFilterValues 

है वास्तव में, ConstructFilterValueArray() विधि (नहीं समारोह) सभी अलग-अलग मान है कि यह एक विशिष्ट स्तंभ में पाया हो और अंतिम तर्क में मौजूद सभी मूल्यों को हटा दें।

इस विधि का VBA कोड

'************************************************************ 
'* ConstructFilterValueArray() 
'************************************************************ 

Sub ConstructFilterValueArray(a() As Variant, iCol As Integer, aRemoveArray As Variant) 

    Dim aValue As New Collection 
    Call GetDistinctColumnValue(aValue, iCol) 
    Call RemoveValueList(aValue, aRemoveArray) 
    Call CollectionToArray(a, aValue) 

End Sub 

'************************************************************ 
'* GetDistinctColumnValue() 
'************************************************************ 

Sub GetDistinctColumnValue(ByRef aValue As Collection, iCol As Integer) 

    Dim sValue As String 

    iEmptyValueCount = 0 
    iLastRow = ActiveSheet.UsedRange.Rows.Count 

    Dim oSheet: Set oSheet = Sheets("X") 

    Sheets("Data") 
     .range(Cells(1, iCol), Cells(iLastRow, iCol)) _ 
      .AdvancedFilter Action:=xlFilterCopy _ 
          , CopyToRange:=oSheet.range("A1") _ 
          , Unique:=True 

    iRow = 2 
    Do While True 
     sValue = Trim(oSheet.Cells(iRow, 1)) 
     If sValue = "" Then 
      If iEmptyValueCount > 0 Then 
       Exit Do 
      End If 
      iEmptyValueCount = iEmptyValueCount + 1 
     End If 

     aValue.Add sValue 
     iRow = iRow + 1 
    Loop 

End Sub 

'************************************************************ 
'* RemoveValueList() 
'************************************************************ 

Sub RemoveValueList(ByRef aValue As Collection, aRemoveArray As Variant) 

    For i = LBound(aRemoveArray) To UBound(aRemoveArray) 
     sValue = aRemoveArray(i) 
     iMax = aValue.Count 
     For j = iMax To 0 Step -1 
      If aValue(j) = sValue Then 
       aValue.Remove (j) 
       Exit For 
      End If 
     Next j 
    Next i 

End Sub 

'************************************************************ 
'* CollectionToArray() 
'************************************************************ 

Sub CollectionToArray(a() As Variant, c As Collection) 

    iSize = c.Count - 1 
    ReDim a(iSize) 

    For i = 0 To iSize 
     a(i) = c.Item(i + 1) 
    Next 

End Sub 

इस कोड को निश्चित रूप से स्ट्रिंग की किसी सरणी लौटने लेकिन VBA में सरणी के साथ काम करने में सुधार किया जा सकता आसान नहीं है।

चेतावनी: इस कोड को काम केवल यदि आप एक पत्रक नामित एक्स परिभाषित क्योंकि CopyToRange AdvancedFilter() में इस्तेमाल किया पैरामीटर एक एक्सेल रेंज की जरूरत है!

यह एक शर्म की बात है कि Microfsoft बस xlNotFilterValues ​​रूप में एक नया enum जोड़ने में इस समाधान को लागू किया है नहीं करता है! ... या xlRegexMatch!

0

वैकल्पिक VBA के फ़िल्टर समारोह

का उपयोग कर के हाल ही के जवाब @schlebe लिए एक अभिनव विकल्प के रूप में, मैं जो फिल्टर बाहर किसी विशेष खोज के लिए अनुमति देता है VBAमें एकीकृत Filter समारोह, का उपयोग करने की कोशिश की स्ट्रिंग को तीसरे तर्क को गलत तरीके से सेट करना। सभी "नकारात्मक" तलाश किए जाने (जैसे ए, बी, सी) एक सरणी में परिभाषित कर रहे हैं। मैंने कॉलम ए में डेटाफील्ड सरणी में मानदंड पढ़ा है और मूल रूप से इन वस्तुओं को फ़िल्टर करने के लिए बाद में फ़िल्टरिंग (ए - सी) निष्पादित किया है।

कोड

Sub FilterOut() 
Dim ws As Worksheet 
Dim rng As Range, i As Integer, n As Long, v As Variant 
' 1) define strings to be filtered out in array 
    Dim a()     ' declare as array 
    a = Array("A", "B", "C") ' << filter out values 
' 2) define your sheetname and range (e.g. criteria in column A) 
    Set ws = ThisWorkbook.Worksheets("FilterOut") 
    n = ws.Range("A" & ws.Rows.Count).End(xlUp).row 
    Set rng = ws.Range("A2:A" & n) 
' 3) hide complete range rows temporarily 
    rng.EntireRow.Hidden = True 
' 4) set range to a variant 2-dim datafield array 
    v = rng 
' 5) code array items by appending row numbers 
    For i = 1 To UBound(v): v(i, 1) = v(i, 1) & "#" & i + 1: Next i 
' 6) transform to 1-dim array and FILTER OUT the first search string, e.g. "A" 
    v = Filter(Application.Transpose(Application.Index(v, 0, 1)), a(0), False, False) 
' 7) filter out each subsequent search string, i.e. "B" and "C" 
    For i = 1 To UBound(a): v = Filter(v, a(i), False, False): Next i 
' 8) get coded row numbers via split function and unhide valid rows 
    For i = LBound(v) To UBound(v) 
     ws.Range("A" & Split(v(i) & "#", "#")(1)).EntireRow.Hidden = False 
    Next i 
End Sub 
[एक्सेल VBA स्वत: फ़िल्टर सभी लेकिन तीन] (की
संबंधित मुद्दे