Microsoft Excel

Herbers Excel/VBA-Archiv

VBA Autofilter mit Array, und ungleich operator


Betrifft: VBA Autofilter mit Array, und ungleich operator von: tibo hansen
Geschrieben am: 13.09.2019 08:24:05

Hallo zusammen,

ich beiße mir gerade die Zähne daran aus einen Autofilter basierend auf einem Array zu erstellen, der:

1. Den Filter auch dann setzt, wenn nicht der ganze string übereinstimmt, sondern nur ein Teil des strings. (daher der Anzsatz das Array in in ** zu setzten --> funktioniert aber nicht)

2. Den Filter zu negieren. Ich möchte quasi alle Inhalte dargestellt haben, die NICHT dem Inhalt des Arrays entsprechend.

Vielleicht ist mein Ansatz ja insgesamt nicht der beste. Oder liegt es nur an einer falschen Syntax

Ich bin auf euren Input gespannt. Danke!

         Option Explicit
       
       Public Sub Filterarray()
       Dim loLetzte As Long, loLetzte1 As Long, i As Long, n As Long
       Dim arFilter() As Variant
       
       'ich bin von folgendem ausgegangen:
       'Deine Namensliste befindet sich in Tabelle2
       'Die Namen sind in Spalte A und beginnen ab Zeile 2
       'die Namensliste ist lückenlos befüllt
       With Worksheets(4)
           'ermitteln der letzten belegten Zelle in Spalte A
           loLetzte = .Cells(.Rows.Count, 1).End(xlUp).Row
           'Dimensionieren des Arrays
           ReDim Preserve arFilter(loLetzte - 2)
           'Schleife von Zeile 2 bis letzte belegte Zeile
           For i = 2 To loLetzte
               'Werte aus den Zellen ins Array schreiben
               arFilter(n) = .Cells(i, 1)
               'Zähler fürs Array hochzählen
               n = n + 1
               'nächste Zeile
           Next i
       End With
       
       'ich bin von folgendem ausgegangen:
       'die Daten die gefiltert werden sollen befinden sich in Tabelle1
       'Filterbereich sind die Spalten A4 bis K letzte belegte Zeile
       With Worksheets(1)
           'ermitteln der letzten belegten Zeile in Spalte A
           loLetzte1 = .Cells(.Rows.Count, 1).End(xlUp).Row
           'Filter von A bis K, Zeile 3
           .Range("A1:AD1").AutoFilter
           'Filterbereich von A4 bis K letzte belegte Zeile, filtern nach Spalte B
           .Range("$A$1:$AD$" & loLetzte1).AutoFilter Field:=7, Criteria1:="<>*arFilter*", Operator:=   _
        _
       _
       _
       xlFilterValues   ' <<<<_ problem!!!!!
       End With
       End Sub 

  

Betrifft: Gegenvorschlag von: 1712796.html
Geschrieben am: 13.09.2019 08:38:09

Hi,

arbeite ohne Filter: blende die Zeilen gleich beim Schleifendruchlauf aus anstatt sie erst ins Array zu schreiben und dann einen Filter zu setzen.


GrußformelBeverly's Excel - Inn
  

Betrifft: AW: Muster-Lösung von: 1712797.html
Geschrieben am: 13.09.2019 08:41:01

Hallo,

im Archiv habe ich folgende Musterlösung:

Sub Filter_invert()
Dim Spalte As Range
Dim Zelle As Range
Dim rngAF As Range
Dim Filter As String


Set rngAF = ActiveSheet.AutoFilter.Range
Set Spalte = Intersect(ActiveCell.EntireColumn, rngAF)

For Each Zelle In Spalte
    If Zelle.EntireRow.Hidden = True Then Filter = Filter & "|" & Zelle.Value
Next

ActiveSheet.ShowAllData
rngAF.AutoFilter Field:=Spalte.Column - rngAF.Column + 1, _
                Criteria1:=Split(Mid(Filter, 2), "|"), _
                Operator:=xlFilterValues

End Sub
Versuche zuerst den Code zu verstehen, falls es dennoch Fragen geben sollte, bitte mit einer kleinen Beispieldatei.

mfg
  

Betrifft: AW: Gegenvorschlag von: 1712798.html
Geschrieben am: 13.09.2019 08:41:04

blende die Zeilen gleich beim Schleifendruchlauf aus
Kannst du mir einen Hinweis geben, wie genau ich "ausblenden" sollte? Also mit welcher Funktion hattest du dir das gedacht?
  

Betrifft: AW: VBA Autofilter mit Array, und ungleich operator von: 1712802.html
Geschrieben am: 13.09.2019 08:52:29

Hi
Das FilterArray für den Autofilter muss jeden Wert, der Angezeigt werden soll, mindestens 1x als vollständigen Text enthalten.
Das ist die einzige Möglichkeit, das FilterArray zu verwenden.
Operatoren oder Joker funktionieren mit dem FilterArray nicht.

Der Weg ist hier, in einer Schleife aus den vorhandenen Daten das FilterArray entsprechenden zu erstellen.
Die notwendige Schleife brauchst du nicht scheuen, beim Arbeiten mit Arrays ist Excel sehr schnell.

Gruß Daniel

  

Betrifft: AW: VBA Autofilter mit Array, und ungleich operator von: 1712819.html
Geschrieben am: 13.09.2019 09:29:26

  Der Weg ist hier, in einer Schleife aus den vorhandenen Daten das FilterArray entsprechenden zu  _
  erstellen.
   Die notwendige Schleife brauchst du nicht scheuen, beim Arbeiten mit Arrays ist Excel sehr schnell.
Das ist doch schon vorhanden oder, wie meinst du das?

Ich sehe jetzt nur noch den Weg, eine neue Spalte hinzufügen, die z.B. mit einem "x" gefüllt wird nachdem eine For Schleife jede Zelle einzeln überprüft hat.
  

Betrifft: AW: VBA Autofilter mit Array, und ungleich operator von: 1712827.html
Geschrieben am: 13.09.2019 09:55:14

Hi

du musst dir die Werte der Spalten, in welcher die Filtern willst, in ein eindimensionales Array einlesen.
dann musst du aus diesem Array in einer Schleife alle Werte entfernen, die nicht angezeigt werden sollen.
dieses Array verwendest du dann als FilterArray.

also im Prinzip etwa so

dim arrGesamt
 dim arrFilter
 dim arrAusschluss
 dim zG as Long, zA as long
 
 '--Alle Werte der Filterspalte einlesen
 arrGesamt = Sheets(1).UsedRange.Columns(7).Value 
 '--- Ausschlusswerte einlesen
 arrAusschluss = Worksheets(4).Usedrange.columns(1).Value
 '--eindimensionales FitlerArray anlegen
 redim arrFilter(1 to Ubound(arrGesamt)) 
 
 '--FilterArray befüllen:
 for zG = 2 to Ubound(arrGesamt, 1)
    for zA = 2 to Ubound(arrAusschluss, 1)
        if arrGesamt(zG, 1) like "*" & arrAusschluss(zA, 1) & "*" then Exit for
    next
    if zA > Ubound(arrAussluss, 1) then arrFilter(zG) = arrGesamt(zG, 1)
 next
 
 '--- Filtern
 Sheets(1).UsedRange.Autofilter Field:=7, Criteria1:=arrFilter, Operator:=xlfiltervalues
Code ist jetzt mangels Beispieldatei weder getesetet, noch auf Schreibfehler geprüft.
Bitte Tippfehler meinerseit selbstständig bereinigen.

Gruß Daniel
  

Betrifft: AW: VBA Autofilter mit Array, und ungleich operator von: 1712859.html
Geschrieben am: 13.09.2019 11:33:50

Vielen Dank Daniel!. Wirklich toll, dass du dir die Mühe für mich gemacht hast!

Dein Code funktioniert perfekt. Ich setze ihn hier jetzt noch mal rein, da ein winziger typo drin war und ich zusätzlich den Code noch erweitert habe, sodass Treffer auch unabhängig von Groß- oder Kleinschreibung gefunden werden.

Sub Titel()
Dim arrGesamt
Dim arrFilter
Dim arrAusschluss
Dim zG As Long, zA As Long

'--Alle Werte der Filterspalte einlesen
arrGesamt = Sheets(1).UsedRange.Columns(7).Value
'--- Ausschlusswerte einlesen
arrAusschluss = Worksheets(4).UsedRange.Columns(1).Value
'--eindimensionales FitlerArray anlegen
ReDim arrFilter(1 To UBound(arrGesamt))

'--FilterArray befüllen:
For zG = 2 To UBound(arrGesamt, 1)
   For zA = 2 To UBound(arrAusschluss, 1)
       If LCase(arrGesamt(zG, 1)) Like LCase("*" & arrAusschluss(zA, 1) & "*") Then Exit For
   Next
   If zA > UBound(arrAusschluss, 1) Then arrFilter(zG) = arrGesamt(zG, 1)
Next

'--- Filtern
Sheets(1).UsedRange.AutoFilter Field:=7, Criteria1:=arrFilter, Operator:=xlFilterValues
End Sub

Beiträge aus dem Excel-Forum zum Thema "VBA Autofilter mit Array, und ungleich operator"