Makro Autofilter mit mehrfachem Zellbezug

Hubi1337

Newbie
Registriert
März 2008
Beiträge
5
Moin zusammen,

ich bastel gerade ein Makro, das ein Autofilter dynamisch verändern soll. Es soll in Sheet W nach den Werten in A1:A10 von Sheet X gesucht werden.

Folgender Code funktioniert soweit:
Sub Filter_Ref_Vorgang()
Worksheets("W").Select
Range("B2:AB25000").Select
Selection.AutoFilter Field:=15, Criteria1:=Sheets("X").Range("A1")
End Sub

Ich finde nur keinen Weg, Range("A1:A10) umzusetzen. Bei Google bin ich bislang leider auch nicht fündig geworden.

Kann jemand helfen? Vielen Dank im Voraus!
 
Ich glaube das range...select kannst du dir sparen, die Autofilter sind ja durchnummeriert.
Ansonsten: Der Filter vergleicht ja die Spalte mit einem konkreten Wert.
Ansonsten müsstest du mit Criteria1:=Array(...) arbeiten.
 
Range.select kann man sich in den allermeisten Faellen sparen ...
einfach direkt ansprechen ...
Code:
Worksheets("W").Range("B2:AB25000").AutoFilter Field:=15, Criteria1:=Sheets("X").Range("A1")

Wobei ich persoenlich die Tabellen ueber den Namen, der in den VBA Eigenschaften zum Blatt definiert wurde, nutze.
Hat den Vorteil, dass man unabhängig von der Nutzerebene ist, aber den Nachteil, dass man so nicht Mappenuebergreifend arbeiten kann.
Code:
Tabelle1.Range("B2:AB25000").AutoFilter Field:=15, Criteria1:=Tabelle2.Range("A1")
Und wie halwe schon schrieb, wenn du mehrere Kriterien nutzen möchtest, musst du mit Array arbeiten.

Als kleinen Tipp fuer solche kleinen Sachen:
Einfach mal das Ganze mit dem Makrorekorder aufnehmen und schauen, was der so produziert hat.
 
Mehrere Kriterien?
Hppla, war das hier oder in einem anderen Forum? Irgendwie bekommt man per Hand 3 oder wie viel Kriterien hin, VBA hat aber eine Macke und kommt nach #2 schon aus dem Tritt.
CN8
 
Danke euch soweit. Die vorgeschlagenen Lösungen helfen mir leider nicht weiter. (Per Zellbezug filtern lässt sich leider nicht über die Aufzeichnung umsetzen)

Ich brauche weiterhin den Zellbezug zum Filtern. A1:A10 enthält die Begriffe, die gefiltert werden sollen. Diese verändern sich häufig (Die Datei findet bei mehreren verschiedenen Projekten mit jeweils 25.000 Zeilen ihre Anwendung). Daher fällt leider auch Array raus, da ich (soweit ich das eben selber hinkriege) dort nur feste Begriffe in "" eingeben kann. Diese manuelle Eingabe fällt aber definitiv raus. Habt ihr sonst noch Ideen?
 
Da mir Excel permanent ohne Fehlermeldung abschmiert beim herumspielen mit Autofilter ...
Das Ganze einmal mit dem Spezialfilter:
Code:
' Tabellenblatt:

Private Sub Worksheet_Change(ByVal Target As Range) ' ausfuehren bei Aenderung Inhalt

        Dim RaBereich As Range
          
        Set RaBereich = Tabelle1.Range("H5:H7")                     ' Kriterienbereich ohne Titelzeile
        Set RaBereich = Intersect(RaBereich, Range(Target.Address)) ' geänderte Zellen liegen im überwachten Bereich
      
        If Not RaBereich Is Nothing Then
            Call filtern
        End If
        Set RaBereich = Nothing
End Sub
Code:
' Modul

Sub filtern()

    Dim anzahl As Long
  
    anzahl = WorksheetFunction.CountA(Tabelle1.Range("H5:H7"))  ' CountA: zaehlt alle nicht leeren Zellen im Kriterienbereich ohne Titelzeile
    Tabelle1.Range("D9:E16").AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Tabelle1.Range(Tabelle1.Cells(4, 8), Tabelle1.Cells(4 + anzahl, 8)), Unique:=False

End Sub

Erklaerung:
Wenn im Kriterienbereich ein Zellinhalt geaendert wird, wird das Makro "filtern" aufgerufen.
Dieses zaehlt einmal die Anzahl der nicht leeren Zellen im Kriterienbereich, um dessen Groeße zu definieren
und wendet dann den Spezialfilter an.
Entsprechend muss im Kriterienbereich von oben nach unten ausgefuehlt werden.
Bei einer leeren Zelle funktioniert der Filter nicht.
 

Anhänge

Ich habe auch noch ein bisschen getestet und kann bestätigen, dass das Rumbasteln mit Autofilter-Makros gern mal zu einem Absturz führt.
Dabei bin ich zu der Erkenntnis gekommen, dass die Werte bei Criteria1 als Strings bereitgestellt und verglichen werden. Das Makro
Code:
    ActiveSheet.Range("$C$1:$D$108").AutoFilter Field:=1, _
    Criteria1:=Array( _
        Tabelle3.Range("A1").Text, _
        Tabelle3.Range("A2").Text, _
        Tabelle3.Range("A3").Text, _
        Tabelle3.Range("A4").Text), _
        Operator:=xlFilterValues
funktioniert!!
Aber nur wenn die Werte in Tabelle3 genauso formatiert sind, wie in der Tabelle mit dem Filter.
Es ist mir dabei nicht gelungen, dem Parameter Criteria1 direkt ein Range-Array mitzugeben.

Aber an sich könnte das Ganze so funktionieren.:cool_alt:
 
  • Gefällt mir
Reaktionen: Hubi12587 und Scientist
Zurück
Oben