Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1608to1612
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
Inhaltsverzeichnis

Speichern und Anwenden von Filtern mit einem Array

Speichern und Anwenden von Filtern mit einem Array
21.02.2018 09:30:05
Filtern
Liebe Excel- Gemeinde,
ich stehe hier vor einem Problem:
Ich habe eine Excel Liste, bei welcher sich in der Zeile 7 über die Spalten hinweg zahlreiche Filter befinden.. ca. locker >30 Stück.
Ich will ein Makro programmieren, welches nach dem Einstellen von Filtern die aktuelle (Filter)Auswahl speichert (über das Klicken einer Schaltfläche);
und ein zweites Makro, das später die alten Einstellungen der Filter wieder zurückholt und auf die Liste anwendet (ebenfalls wieder unter einer Schaltfläche)
Ich habe schon im Internet recherchiert, das ganze muss mit einem Array gemacht werden.. Leider kenn ich mich bisher in der objektorientierten Programmierung bei VBA gar nicht wirklich aus..
Im Folgenden ist mein aktueller Code, den ich aus dem Internet kopiert habe.. Die MSG Box wird natürlich nicht benötigt.. Könnt ihr mir helfen, wie ich den Code auf mein Tabellenblatt hin modifizieren muss? In sämtlichen Büchern findet man zu dem Thema praktisch keine Hilfe..
Sub Filter_Save()
Dim w As Worksheet
Dim filterArray()
Dim currentFiltRange As String
Dim col As Integer
Set w = ActiveSheet
' Capture AutoFilter settings
With w.AutoFilter
currentFiltRange = .Range.Address
With .Filters
ReDim filterArray(1 To .Count, 1 To 3)
For f = 1 To .Count
With .Item(f)
If .On Then
filterArray(f, 1) = .Criteria1
If .Operator Then
filterArray(f, 2) = .Operator
'filterArray(f, 3) = .Criteria2 'simply delete this line to make it  _
work in Excel 2010
End If
End If
End With
Next f
End With
End With
MsgBox "Variante1: " & Variable1 & "" & vbNewLine & "Reihe :" & Spalte1 & ""
End Sub

und für das "Zurückholen":
Sub ReDoAutoFilter()
Dim w As Worksheet
Dim filterArray()
Dim currentFiltRange As String
Dim col As Integer
Set w = ActiveSheet
' Restore Filter settings
For col = 1 To UBound(filterArray(), 1)
If Not IsEmpty(filterArray(col, 1)) Then
If filterArray(col, 2) Then
w.Range(currentFiltRange).AutoFilter field:=col, _
Criteria1:=filterArray(col, 1), _
Operator:=filterArray(col, 2), _
Criteria2:=filterArray(col, 3)
Else
w.Range(currentFiltRange).AutoFilter field:=col, _
Criteria1:=filterArray(col, 1)
End If
End If
Next col
End Sub

Danke schonmal im Vorraus,
LG
Timo

3
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Speichern und Anwenden von Filtern mit einem Array
21.02.2018 11:08:33
Filtern
Hallo
das Problem ist, das die Daten flüchtig sind. Sie müssen nachdem das makro durchgelaufen ist, erhalten bleiben. Dazu kann das z.B. in einem temporären Blatt (kann ausgeblendet sein) gespeichert werden.
  • lege ein Blatt TMP an
  • füge deine Filter hinzu
  • und stelle die Filter entsprechend deinen Wünschen ein
  • nach Ausführen des 1. Makros sind die Einstellungen im Blatt TMP abgelegt
  • soviele Zeilen, wie Filter nebenenander vorhanden sind, 3 Spalten breit
  • wenn du jetzt deine Filter anders einstellst, solltest du aber die Anzahl und Positionen der Filter nicht verändern.
  • bei Ausführung des 2. Makros wird die Anzahl der gesetzen Filter ermittelt und dann aus dem TMP-Blatt entsprechend x Zeilen (=Anzahl Filter) zurückgelesen.
    Sub Filter_Save()
        Dim w As Worksheet
        Dim filterArray()
        Dim currentFiltRange As String
        Dim col As Integer
        Dim f As Integer
        Dim Anz As Integer
        Set w = ActiveSheet
    
        ' Capture AutoFilter settings 
        If ActiveSheet.AutoFilterMode Then 'Ist überhaupt ein Filter gesetzt? 
            With w.AutoFilter
                currentFiltRange = .Range.Address
                With .Filters
                    Anz = .Count 'Anzahl der Filter 
                    Redim filterArray(1 To Anz, 1 To 3)
                    For f = 1 To Anz
                        With .Item(f)
                            If .On Then
                                filterArray(f, 1) = .Criteria1
                                If .Operator Then
                                    filterArray(f, 2) = .Operator
                                    filterArray(f, 3) = .Criteria2
                                End If
                            End If
                        End With
                    Next f
                End With
                With Sheets("TMP")
                    .Cells.ClearContents
                    .Range("A1").Resize(Anz, 3) = filterArray
                End With
            End With
        Else
            MsgBox "Kein Filter gesetzt"
        End If
    End Sub
    
    Sub ReDoAutoFilter()
        Dim w As Worksheet
        Dim filterArray()
        Dim currentFiltRange As String
        Dim col As Integer
        Dim Anz As Integer
        Set w = ActiveSheet
    
        ' Restore Filter settings 
        If ActiveSheet.AutoFilterMode Then 'Ist überhaupt ein Filter gesetzt? 
            Anz = w.AutoFilter.Filters.Count 'Anzahl der gesetzten Filter 
            w.ShowAllData
            filterArray = Sheets("TMP").Range("A1").Resize(Anz, 3).Value
            currentFiltRange = w.AutoFilter.Range.Address
            
            For col = 1 To Anz
                If Not IsEmpty(filterArray(col, 1)) Then
                    If filterArray(col, 2) Then
                        w.Range(currentFiltRange).AutoFilter field:=col, _
                        Criteria1:=filterArray(col, 1), _
                        Operator:=filterArray(col, 2), _
                        Criteria2:=filterArray(col, 3)
                    Else
                        w.Range(currentFiltRange).AutoFilter field:=col, _
                        Criteria1:=filterArray(col, 1)
                    End If
                End If
            Next col
        Else
            MsgBox "Kein Filter gesetzt"
        End If
    End Sub
    

    LG UweD
  • Anzeige
    AW: Speichern und Anwenden von Filtern mit einem Array
    21.02.2018 11:44:51
    Filtern
    Hallo Uwe,
    vielen Dank für deine Hilfe :) Ich habe es direkt ausprobiert.. Leider bleibt es bei einem Punkt stehen:
    Sub Filter_Save()
    Dim w As Worksheet
    Dim filterArray()
    Dim currentFiltRange As String
    Dim col As Integer
    Dim f As Integer
    Dim Anz As Integer
    Set w = ActiveSheet
    ' Capture AutoFilter settings
    If ActiveSheet.AutoFilterMode Then 'Ist überhaupt ein Filter gesetzt?
    With w.AutoFilter
    currentFiltRange = .Range.Address
    With .Filters
    Anz = .Count 'Anzahl der Filter
    ReDim filterArray(1 To Anz, 1 To 3)
    For f = 1 To Anz
    With .Item(f)
    If .On Then
    filterArray(f, 1) = .Criteria1
    If .Operator Then
    filterArray(f, 2) = .Operator
    filterArray(f, 3) = .Criteria2
    End If
    End If
    End With
    Next f
    End With
    With Sheets("TMP")
    .Cells.ClearContents
    .Range("A1").Resize(Anz, 3) = filterArray
    End With
    End With
    Else
    MsgBox "Kein Filter gesetzt"
    End If
    End Sub
    

    also bei dem filerArray (f,3)=.criteria2 (kursiv)
    Weißt du, was ich hier noch ändern muss ? Es kommt ein Laufzeitfehler 1004, selbst debuggen bringt nichts..
    LG
    Timo
    Anzeige
    offen
    21.02.2018 12:01:24
    UweD
    klappt bei mir problemlos

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige