452 Aufrufe
Gefragt in Tabellenkalkulation von sheep225 Einsteiger_in (86 Punkte)
Hallo liebe Foriker,

ich habe folgende Aufgabenstellung: ich habe eine Artikelliste mit 5 Blättern; Spalte A (Artikelnummer) ist in allen Blättern gleich, bzw. ich verweise mit  [='Artikelliste Basis'!Ax]  in Blatt 2-5 auf die Spalte A in Blatt 1.

Die weiteren Spalten unterscheiden sich von Blatt zu Blatt.

In Blatt 1 habe ich Autofilter gesetzt; nun möchte ich erreichen, dass ein Filter in Blatt 1 auch eine Filterung der anderen Tabellenblätter bewirkt. Beispielsweise habe ich in Blatt 1 / Spalte H ein Kriterium, das nur für einige Artikelnummern zutrifft (x); filtere ich nun Spalte H nach x, dann sind in Spalte A ja nur diejenigen Artikelnummern zu sehen, für welche das x zutrifft.

Wie kann ich nun (automatisiert) erreichen, dass die Blätter 2-5 auf Grund der Ausgabe in Blatt 1 / Spalte A gefiltert werden? Die Funktion sollte natürlich für jeden Filter im Blatt 1 nutzbar sein...

Ich hoffe ich habe mich einigermassen verständlich ausgedrückt...

Vielen Dank für jegliche Hilfe

14 Antworten

0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)
Hi,

Möglichkeit: laufe in einer Schleife über alle Zeilen der gefilterten Tabelle, prüfe ob die laufende Zeile ausgeblendet ist und wenn ja, blende dieselbe Zeile in den anderen Tabellenblättern ebenfalls aus.

Bis später, Karin
0 Punkte
Beantwortet von sheep225 Einsteiger_in (86 Punkte)
Hallo Karin,

der Ansatz klingt interessant!
Ich hab nur leider zu wenig Ahnung von vba um das ohne Hilfe umzusetzen.... könntest du mir dabei helfen?

Vielen Dank!
0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi,

Sub FilterWiederholen()
    Dim rngFilter As Range
    Dim rngZelle As Range
    Dim lngTab As Long
    Dim lngZaehler As Long
    Dim rngGefiltert As Range
    Set rngFilter = Worksheets("Tabelle1").AutoFilter.Range
    If rngFilter.Columns(1).SpecialCells(xlCellTypeVisible).Count <> rngFilter.Columns(1).Cells.Count Then
        For Each rngZelle In rngFilter.Columns(1).Cells
            If rngZelle.RowHeight = 0 Then
                If rngGefiltert Is Nothing Then
                    Set rngGefiltert = rngZelle
                Else
                    Set rngGefiltert = Union(rngGefiltert, rngZelle)
                End If
            End If
        Next rngZelle
        For lngTab = 2 To 5
            With Worksheets(lngTab)
                If .AutoFilterMode Then
                    .AutoFilter.ShowAllData
                    .Range(rngGefiltert.Address).Rows.EntireRow.Hidden = True
                End If
            End With
        Next lngTab
    End If
End Sub

Beachte jedoch, dass mit diesem Code in den Tabellen 2 bis 5 KEIN AUTOFILTER gesetzt wird, sondern einfach nur die Zeilen ausgeblendet werden.

Bis später, Karin

0 Punkte
Beantwortet von sheep225 Einsteiger_in (86 Punkte)
Hallo Karin,

ich hab den Code nun mal getestet, leider erfolglos....
Nur zum Verständnis: der Code muss in Tabelle1 rein?
Dann filtere ich nach einer beliebigen Spalte in Tabelle 1, führe das Makro aus und dann sollten die anderen Blätter ebenfalls "gefiltert" werden?

Spielt es eine Rolle in welcher Spalte ich den Autofilter setze, oder in welcher Zeile die Datentabelle beginnt? Bei mir sind 8 Zeilen Spaltenüberschrift etc, die Autofilter Dropdowns sitzen als in Zeile 8.

Vielen Dank nochmals!
Gruss Daniel
0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi Daniel,

was verstehst du unter "leider erfolglos"? Mit solch lapidaren Aussagen kann man absolut nichts anfangen - du musst schon sagen "WAS" nicht funktioniert - macht der Code nicht das gewünschte, löst er einen Fehler aus und wenn ja was sagt der Debugger genau usw.

Du schreibst "Datentabelle" - meinst du damit eine formatierte/intelligente Tabelle oder ganz normal die Daten deines Autofilterbereichs im Tabellenblatt?

Ich rate mal, du verwendest keinen "normalen" Autofilter sondern eine formatierte Tabelle - dann muss der Code wie folgt geändert werden:

Sub FilterWiederholen()
    Dim rngFilter As Range
    Dim rngZelle As Range
    Dim lngTab As Long
    Dim rngGefiltert As Range
    Set rngFilter = Worksheets("Tabelle1").ListObjects(1).Range
    If rngFilter.Columns(1).SpecialCells(xlCellTypeVisible).Count <> rngFilter.Columns(1).Cells.Count Then
        For Each rngZelle In rngFilter.Columns(1).Cells
            If rngZelle.RowHeight = 0 Then
                If rngGefiltert Is Nothing Then
                    Set rngGefiltert = rngZelle
                Else
                    Set rngGefiltert = Union(rngGefiltert, rngZelle)
                End If
            End If
        Next rngZelle
        For lngTab = 2 To 5
            With Worksheets(lngTab).ListObjects(1)
                If .AutoFilter.FilterMode Then
                    .AutoFilter.ShowAllData
                End If
                .DataBodyRange.Rows.Hidden = False
            End With
            Worksheets(lngTab).Range(rngGefiltert.Address).Rows.EntireRow.Hidden = True
        Next lngTab
    End If
End Sub

Es spielt keine Rolle, in welcher Spalte der Filter gesetzt ist, denn welche Kriterien gesetzt sind, kann man nicht auslesen, weil es zu viele Kombinationsmöglichkeiten gibt. Deshalb prüft der Code stattdessen, welche Zellen nicht sichtbar (also herausgefiltert) sind. Diese werden auf eine Variable geschrieben, sodass in den anderen Tabellenblättern genau dieselben Zeilen ausgeblendet werden. Aus diesem Grund ist es wichtig das zu beachten, was ich bereits in meinem vorhergehenden Beitrag geschrieben habe: in den anderen Tabellen wir KEIN FILTER gesetzt sondern nur dieselben Zeilen ausgeblendet wie in der ersten Tabelle.

Den Code musst du von Hand starten, da das Setzen eines Filters kein Ereignis auslöst, welches man auslesen kann um den Code automatisch zu starten.

Bis später, Karin

0 Punkte
Beantwortet von sheep225 Einsteiger_in (86 Punkte)
Bearbeitet von sheep225

Hallo Karin,
bitte entschuldige, mit "leider erfolglos" meinte ich, dass genau gar nichts passiert ist. Keine Fehlermeldung, aber auch kein Ausblenden in den anderen Tabellenblättern. Einfach nichts....

Mit Datentabelle meinte ich den Bereich der Tabelle, der die zu sortierenden Daten enthält (ab Zeile 8).

Ich habe nun eine Beispieltabelle nachgebaut, welche ich hier eigentlich hochladen wollte... Da erhalte ich bei beiden Varianten des Codes die Meldung "Laufzeitfehler '9': Index ausserhalb des gültigen Bereichs".

Bei der zweiten Variante bricht der Code sofort ab in der Zeile
Set rngFilter = Worksheet("Tabelle1").ListObjects(1).Range

Bei der ersten Variante des Codes läuft der Code mehrfach durch (beide Schleifen) und bricht dann in der 2.Schleife ab.

Ich habe in meinem Beispiel total 9 Datensätze (Zeilen) in Tabelle 1, gefiltert sind es dann 3. Der Code läuft dann auch 9x durch die erste Schleife und 3x durch die 2.Schleife und bricht dann ab ohne dass in den weiteren Tabellenblättern etwas passiert wäre.Artikelliste

0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)
Hi,

Hochladen einer Mappe: Icon Bild -> Register: Hochladen -> Durchsuchen -> Mappe auswählen -> Zum Server senden

Bis später, Karin
0 Punkte
Beantwortet von sheep225 Einsteiger_in (86 Punkte)

Als Bild scheint es nicht zu gehen, aber als Link?

https://supportnet.de/forum/?qa=blob&qa_blobid=13761097947481845880

0 Punkte
Beantwortet von beverly_ Experte (3.3k Punkte)

Hi,

du solltest ja auch kein Bild hochladen, nur über dieses Icon den Upload für die Mappe aufrufen...

Du hast in den anderen Tabellenblättern keinen Autofilter aktiviert - deshalb reicht dieses:

        For lngTab = 2 To 4
            With Worksheets(lngTab)
                .Range(rngGefiltert.Address).Rows.EntireRow.Hidden = True
            End With
        Next lngTab

Bis später, Karin

0 Punkte
Beantwortet von sheep225 Einsteiger_in (86 Punkte)

Hallo Karin,

ja, mein Fehler, da war ich etwas zu schnell mit der Beispieltabelle; bitte entschuldige!
Natürlich sollte in allen Tabellen ein Autofilter drin sein, und wie im Eingangspost geschrieben sollte das Makro in allen Tabellen funktionieren.

Der gekürzte Code hat funktioniert in der unvollständigen Tabelle.

Hier nochmal die vollständige Tabelle: https://supportnet.de/forum/?qa=blob&qa_blobid=13719093494195235346

...