Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Autofilter per vba einstellen
27.05.2021 10:01:29
Christian
Hallo zusammen,
ich habe hier eine Tabelle, in der ich Werte grafisch darstelle, wobei diese gefiltert werden sollen (Autofilter). Weil ich die Filterkombinationen sehr oft ändern muss, habe ich mir zu jedem Filter Schaltflächen erzeugt, mit dessen Hilfe ich die Filtereinstellung anpassen möchte. Meine Daten befinden sich in "$B$10:$CE$1354".
In der Zelle G9 sind nun z. B. vier Filtereinstellungen möglich (neben "Alles auswählen" natürlich):
2,5
3
3,5
4
Ich habe es geschafft Schaltflächen zu erzeugen und aufgezeichnete Macros diesen Schaltflächen zuzuordnen. Aufgrund dessen, wie die Macros aussehen, probiere ich die Syntax zu verstehen und entsprechend dazuzulernen.
Folgendes funktioniert bzw. habe ich z. B. für G9 geschafft.
Ich habe Schaltflächen für "alle", "2.5", "3", "3.5" und "4" erstellt, die die Filtereinstellung für G9 ändern können.
Wenn ich die Schaltfläche "alle" drücke, werden alle Filtereinstellung gelöscht. Das mache ich so:

  • 
    Sub i_EM_alle()
    ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6
    End Sub
    

  • Wenn ich die Schaltfläche "2.5" drücke, dann wird nur der Filter "2.5" eingestellt. Das mache ich so:

  • 
    Sub i_EMG__2_5()
    ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6, Criteria1:="2,5"
    End Sub
    

  • Das bedeutet, ich kann also entweder alle Werte darstellen oder die Werte mit nur einer Filtereinstellung, also z. B. nur die Werte "2.5".
    Wenn ich nun aber z. B. die Werte "2.5" und "3" angezeigt bekommen will, muss ich wieder die Filtereinstellungen "händisch" einstellen.
    Ich will also folgendes:
    Wenn ich die Schaltfläche "2.5" anklicke, dann soll:
    die Filtereinstellung "2.5" gelöscht werden, wenn die Filtereinstellung "2.5" gesetzt war
    oder
    die Filtereinstellung "2.5" gesetzt werden, wenn die Filtereinstellung "2.5" gelöscht war
    Selbst nach 1,5 Tagen Suchen im Internet und Rumprobieren habe ich es nicht hinbekommen. Ich weiß, dass es xlOr und xlAnd gibt, um die Filtereinstellung zu löschen oder zu setzen. Allerdings habe ich schon mal das prinzipielle Problem, dass ich nicht mal weiß, wie man die aktuelle Filtereinstellung ausliest.
    So nach der Art:

  • aktuelle_Filtereinstellungen = ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6, Operator:=xlFilterValues
    neue_Filtereinstellung = aktuelle_Filtereinstellung + "3.5"
    ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6, Criteria1:=neue_Filtereinstellung , Operator:=xlFilterValues

  • Kann mir da bitte jemand weiterhelfen?
    Vielen Dank schon mal im Voraus!

    9
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Autofilter per vba einstellen
    27.05.2021 11:30:11
    Daniel
    Hi
    Das würde ich hier etwas anders machen
    1. ersetze die Buttons durch Formularfeld-Checkboxen
    2. weise jeder Checkbox eine Ausgabezelle in einem freien Bereich der Tabelle zu.
    Diese Zellen sollten untereinander liegen
    3. schreibe neben jede Ausgabezelle den dazugehörigen Zahlenwert.
    4. schreibe in die dritte Spalte dieser kleinen Tabelle die Formel (sinngemäß)
    =Wenn(AusgabeZelle_Checkbox;Zelle_mit_Zahl;"")
    Der zellbereich dieser 3. Spalte ist im Folgenden mit "xxx" bezeichnet.
    5. In eine zusätzliche Spalte in deiner Großen Tabelle schreibst du dann diese Formel (für CF10)
    =Wenn(Oder(Anzahl(xxx)=0;ZählenWenn(xxx;G10));1;0)
    6. richte jetzt den Autofilter manuell ein und filtere in der neuen Spalte CF nach 1.
    7. Schreibe in einem allgemeinen Modul ein kleines Makro, welches den Filter neu anwendet ohne ihn dabei zu verändern (gibt nen Button dafür im Menü, den kannst du mit dem Recorder aufzeichnen)
    Dieses Makro weist du dann den vier Comboboxen über das Kontextmenü zu.
    8. um alle Filter gleichzeitig zu setzen, kannst du dir ein Makro schreiben, dass in die erste Spalte der kleinen Tabelle WAHR/TRUE oder FALSCH/FALSE einträgt.
    Gruß Daniel
    Anzeige
    AW: Autofilter per vba einstellen
    27.05.2021 13:09:12
    Christian
    Hi Daniel,
    erstmal Danke für Deine Antwort. Jetzt habe ich auch etwas über Checkboxen gelernt :-)
    Leider ist Deine Lösung aufgrund Deines Punktes 5 für mich nicht optimal.
    Wenn ich das täte, dann müsste ich sehr viele Spalten einfügen, weil bei mir die Datenbasis (die zu filternden Spalten) oftmals sehr groß sind.
    Du hast mich aber auf eine Idee gebracht:
    Bis zu Punkt 4 habe ich alles gemacht, wie von Dir vorgeschlagen. So habe ich jetzt in einer Spalte (je nach ausgewählter Checkbox) die Werte, die im Filter enthalten sein müssen. In meinem Fall stehen die Werte im Bereich DC2 bis DC5.
    Mein Gedanke war jetzt folgender:
    Ich erzeuge mir aus dieser Spalte einen Array, den ich dann im Script weiterverarbeite.
    Mit folgender Zeile kann ich den Filter ja setzen:

  • ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6, Criteria1:=Array("3,0", "4,0"), Operator:=xlFilterValues ' funktioniert

  • Ich denke, dass hier in einem Array die Filtereinstellung übergeben werden soll.
    Das entsprechende Array habe ich mir jetzt mit Deiner Lösung (Schritte 1 bis 4) dann so zusammengebastelt:
  • Feld(0) = ActiveSheet.Range("DC2").Value ' funktioniert
    Feld(1) = ActiveSheet.Range("DC3").Value
    Feld(2) = ActiveSheet.Range("DC4").Value
    Feld(3) = ActiveSheet.Range("DC5").Value
    Feld = ActiveSheet.Range("DC2:DC5").Value ' funktioniert nicht

  • Gerne hätte ich das mittels der letzten Zeile gemacht, weil es mir eleganter scheint. Leider funktioniert das nicht. Kannst Du mir sagen warum oder geht sowas prinzipiell nicht?
    Jedenfalls sehe ich, dass das Array richtig zusammengesetzt wird (das sehe ich, wenn ich debugge). Aber folgende Zeile funktioniert nicht:

  • ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6, Criteria1:=Feld, Operator:=xlFilterValues ' funktioniert nicht
    ActiveSheet.Range("$B$9:$CE$1354").AutoFilter Field:=6, Criteria1:=Array("3,0", "4,0"), Operator:=xlFilterValues ' funktioniert


  • Ich verstehe das nicht. Für mich sollte das gleichwertig sein. Kannst Du die Syntax korrigieren oder funktioniert das so prinzipiell nicht?
    Anzeige
    AW: Autofilter per vba einstellen
    27.05.2021 13:33:19
    Daniel
    Hi
    Der Filter braucht ein eindimensionales Array
    Das übernehmen eines Zellbereichs mit mehreren Zellen in ein Array erzeugt immer ein zweidimensionales Array.
    Daher geht das nicht direkt.
    Ggf funktioniert es mit
    
    Feld = Worksheetfunction.Transpose(Range("DC2:DC5").Value)
    
    Gruß Daniel
    AW: Autofilter per vba einstellen
    27.05.2021 15:54:02
    Christian
    @Daniel
    Vielen Dank!
    Das funktioniert jetzt.
    AW: Autofilter per vba einstellen
    27.05.2021 13:17:10
    Nepumuk
    Hallo Christian,
    das geht auch ohne die Tabelle zu verbiegen.
    Teste mal: https://www.herber.de/bbs/user/146400.xlsm
    Gruß
    Nepumuk
    Anzeige
    AW: Autofilter per vba einstellen
    27.05.2021 15:58:53
    Christian
    Hallo Nepumuk,
    vielen Dank für Deine Antwort!
    Das ist genau das, was ich brauche. Allerdings verstehe ich nahezu keine Zeile.
    Nachdem ich aber nicht dumm sterben will, werde ich das morgen mal Zeile für Zeile durchgehen und versuchen nachzuvollziehen, wie das funktioniert, damit ich das für meine Bedürfnisse erweitern kann.
    Sollte ich mich morgen nicht wieder melden, dann erst Montag in drei Wochen. Ich habe nämlich nächste und übernächste Woche frei :-)
    VG
    Christian
    AW: Autofilter per vba einstellen
    27.05.2021 16:31:17
    max.kaffl@gmx.de
    Hallo Christian,
    du kannst dich auch per Mail melden. Die Adresse findest du in meinem Profil.
    Gruß
    Nepumuk
    Anzeige
    AW: Autofilter per vba einstellen
    27.05.2021 16:24:41
    Daniel
    Hi
    hier ne VBA-Variante, die genauso mit Butttons funktioniert, wie du dir das vorgestellt hast.
    ich habe es hier für ActiveX-Buttons mit Code im Tabellenblattmodul geschrieben, es müsste aber genauso für Formularfeld-Buttons mit Code in einem allgemeinen Modul funktionieren
    
    Option Explicit
    Dim arrFilter(1 To 4) As String
    Private Sub CommandButton1_Click()
    If arrFilter(1) = "" Then arrFilter(1) = "2,5" Else arrFilter(1) = ""
    Cells(9, 1).CurrentRegion.AutoFilter field:=7, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub CommandButton2_Click()
    If arrFilter(2) = "" Then arrFilter(2) = "3" Else arrFilter(2) = ""
    Cells(9, 1).CurrentRegion.AutoFilter field:=7, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub CommandButton3_Click()
    If arrFilter(3) = "" Then arrFilter(3) = "3,5" Else arrFilter(3) = ""
    Cells(9, 1).CurrentRegion.AutoFilter field:=7, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub CommandButton4_Click()
    If arrFilter(4) = "" Then arrFilter(4) = "4" Else arrFilter(4) = ""
    Cells(9, 1).CurrentRegion.AutoFilter field:=7, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub CommandButton5_Click() '---Button Filter zurücksetzen
    Dim i As Long
    For i = LBound(arrFilter) To UBound(arrFilter)
    arrFilter(i) = ""
    Next
    Cells(9, 1).CurrentRegion.AutoFilter field:=7
    End Sub
    
    Gruß Daniel
    Anzeige
    AW: Autofilter per vba einstellen
    28.05.2021 14:32:58
    Christian
    Hallo Daniel, hallo Nepumuk
    danke für Euren Code.
    @Daniel:
    Zwei kleine Fehler waren noch enthalten, die ich aber selbst nach etwas Lektüre korrigieren konnte.
    Ich habe jetzt mit Deiner Lösung und der Lösung von Nepumuc etwas programmiert, mit dem ich ganz zufrieden bin.
    Falls jemand noch einmal ein ähnliches Problem hat, poste ich das jetzt hier:
    
    Option Explicit
    Dim arrFilter(1 To 4) As String
    Dim Init                            ' das ist eine Krücke, weil man Variablen beim Initialisieren nicht gleich bedaten kann!
    Private Sub i_EMG__2_5_Click()
    If Init = 0 Then                ' beim ersten Aufruf, alle Filterwerte setzen
    Init = 1
    arrFilter(1) = "2,5"
    arrFilter(2) = "3,0"
    arrFilter(3) = "3,5"
    arrFilter(4) = "4,0"
    End If
    With i_EMG__2_5                 '
    If .Value Then              ' wurde die Umschaltfläche gedrückt?
    arrFilter(1) = "2,5"    ' Ja -> Filtereintrag auswählen
    Else
    arrFilter(1) = ""       ' Nein -> Filtereintrag löschen
    End If
    End With
    Cells(9, 1).CurrentRegion.AutoFilter field:=6, Criteria1:=arrFilter, Operator:=xlFilterValues       ' Filter anwenden
    End Sub
    Private Sub i_EMG__3_0_Click()
    If Init = 0 Then
    Init = 1
    arrFilter(1) = "2,5"
    arrFilter(2) = "3,0"
    arrFilter(3) = "3,5"
    arrFilter(4) = "4,0"
    End If
    With i_EMG__3_0
    If .Value Then
    arrFilter(2) = "3,0"
    Else
    arrFilter(2) = ""
    End If
    End With
    Cells(9, 1).CurrentRegion.AutoFilter field:=6, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub i_EMG__3_5_Click()
    If Init = 0 Then
    Init = 1
    arrFilter(1) = "2,5"
    arrFilter(2) = "3,0"
    arrFilter(3) = "3,5"
    arrFilter(4) = "4,0"
    End If
    With i_EMG__3_5
    If .Value Then
    arrFilter(3) = "3,5"
    Else
    arrFilter(3) = ""
    End If
    End With
    Cells(9, 1).CurrentRegion.AutoFilter field:=6, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub i_EMG__4_0_Click()
    If Init = 0 Then
    Init = 1
    arrFilter(1) = "2,5"
    arrFilter(2) = "3,0"
    arrFilter(3) = "3,5"
    arrFilter(4) = "4,0"
    End If
    With i_EMG__4_0
    If .Value Then
    arrFilter(4) = "4,0"
    Else
    arrFilter(4) = ""
    End If
    End With
    Cells(9, 1).CurrentRegion.AutoFilter field:=6, Criteria1:=arrFilter, Operator:=xlFilterValues
    End Sub
    Private Sub i_EMG__alle_Click() '---Button Filter zurücksetzen
    ' wird nicht verwendet
    Dim i As Long
    '    For i = LBound(arrFilter) To UBound(arrFilter)
    '        arrFilter(i) = ""
    '    Next
    arrFilter(1) = "2,5"
    arrFilter(2) = "3,0"
    arrFilter(3) = "3,5"
    arrFilter(4) = "4,0"
    Cells(9, 1).CurrentRegion.AutoFilter field:=6
    End Sub
    
    Ich habe das jetzt (wie von Nepumuk vorgeschlagen) mit Umschaltflächen gelöst, weil ich so sehen kann, ob einFilter gesetzt ist oder nicht.
    Wie Du siehst, habe ich noch Schwierigkeiten mit der Initialisierung. vba lässt wohl, wie z. B. C oder C++, bei der Deklaration keine Wertzuweisung zu. Finde ich etwas seltsam...
    Nun gut, ich habe das dann mit der Init-Variablen (wahrscheinlich etwas umständlich) gelöst.
    Was mir noch nicht gefällt ist, dass beim Öffnen der Exceltabelle die Umschaltflächen irgendwie stehen können. Wenn nicht alle gedrückt sind, dann passt die Initialisierung von arrFilter natürlich nicht mehr.
    Man müsste bei der Initialisierung die Stellung der Umschaltflächen abfragen und dann die Werte für arrFilter entsprechend setzen. Oder man schaltet die Filter beim Öffnen der Tabelle alle ein oder aus und setzt dann entsprechend die Werte bei der Initialisierung.
    Ich weiß aber weder, wie das eine noch das andere geht und ehrlich gesagt, mag ich jetzt Feierabend machen bzw. in den Urlaub gehen :-)
    Danke nochmal, ich habe viel gelernt!
    VG
    Christian
    Anzeige

    302 Forumthreads zu ähnlichen Themen

    Anzeige
    Anzeige
    Anzeige

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige