Filter Funktion in Excel mit VBA

Ich habe folgendes Problem:

In einer Tabelle sind in den Spalten A bis L Daten enthalten. Da die Liste aber zu lang wird, möchte ich eine Filter-Funktion einbauen.
Ich stelle mir diese so vor, dass ab der Spalte M einzelne festgelegte Schlagwörter hinzugefügt werden können. Ich habe eine Userform erstellt wo man diese Schlagwörter über OptionButtons auswählen kann. Nachher sollen die Zeilen wo bspw. das Schlagwort „Auto“ erscheint untereinander in das Tabellenblatt „Suchergebnis“ kopiert werden. Mein Quelltext sieht bisher so aus:

Private Sub Auto_Aktiviert()

Dim Auto As String
Dim Ergebnis As Worksheet

Set Ergebnis = Sheets(„Suchergebnis“)

Columns(„M:Z“).Select (wenn mehrere Schlagwörter zutreffen, würden diese dann in den Spalten nach M stehen)

Auto = „Auto“

Selection.Find(What:=Auto, _
After:=ActiveCell, _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False).Activate
Zeile$ = ActiveCell.Address

Zeile$ = Mid$(ActiveCell.Address, 3)
Rows(Zeile$ + „:“ + Zeile$).Select
Selection.Copy
Sheets(„Suchergebnis“).Select
Rows(„8:8“).Select

ActiveSheet.Paste

End Sub

Bis Zeile 7 ist der Tabellenkopf. Daher sollen die Zeilen ab Zeile 8 kopiert und eingefügt werden. Diese Formel klappt ganz gut, wenn es nur eine Zeile betrifft. Taucht nun das Schlagwort Auto in bspw. Zeile 8, 20, 50 und 100 auf, brauche ich irgendeine Schleife, dass diese Zeilen im Tabellenblatt „Suchergebnis“ in Zeile 8-11 kopiert werden.

Wie muss eine Schleifen-Funktion aussehen, damit dies funktioniert?

Hi Narcassius,

da ich die Vorlage jetzt nicht nachbauen möchte, hier mal ein Beispiel, dass Du Dir aber leicht an Deine Bedürfnisse anpassen kannst.
Voraussetzung:
Tabelle Daten: (hier sollen die Daten in Spalte D und E gefiltert werden
Tabelle Variables: Hier werden in A1 und B1 Variable Begriffe eingetragen, nach denen in der Tabelle Daten gefiltert werden soll.

Sub Filtern()
'Prozedur filtert die Tabelle Daten mit den variablen Werten der Tabelle
'Variables…

Dim rng As Range
Dim rw As Variant
Dim x As Byte
x = 1

With Sheets(„Daten“)

.Activate
Range(„D1“).Activate

Set rng = ActiveCell.CurrentRegion

'Filter zurücksetzen
For Each rw In rng.Columns
rw.AutoFilter Field:=x
x = x + 1
Next

'Filter in Tabelle Daten in den Spalten D und E mit den Werten
'von Tabelle Variables aus den Zellen A1 und B1 setzen
rng.AutoFilter Field:=1, Criteria1:=Sheets(„Variables“).Range(„A1“)
rng.AutoFilter Field:=2, Criteria1:=Sheets(„Variables“).Range(„B1“)

Set rng = Nothing

End With
End Sub

Ciao

Ralf

Ich habe folgendes Problem:

In einer Tabelle sind in den Spalten A bis L Daten enthalten.
Da die Liste aber zu lang wird, möchte ich eine
Filter-Funktion einbauen.
Ich stelle mir diese so vor, dass ab der Spalte M einzelne
festgelegte Schlagwörter hinzugefügt werden können. Ich habe
eine Userform erstellt wo man diese Schlagwörter über
OptionButtons auswählen kann. Nachher sollen die Zeilen wo
bspw. das Schlagwort „Auto“ erscheint untereinander in das
Tabellenblatt „Suchergebnis“ kopiert werden. Mein Quelltext
sieht bisher so aus:

Private Sub Auto_Aktiviert()

Dim Auto As String
Dim Ergebnis As Worksheet
–> dim i as long
Set Ergebnis = Sheets(„Suchergebnis“)

–> for i = 8 to 65000

Columns(„M:Z“).Select (wenn mehrere Schlagwörter zutreffen,
würden diese dann in den Spalten nach M stehen)

Auto = „Auto“

Selection.Find(What:=Auto, _
After:=ActiveCell, _
LookIn:=xlValues, _
LookAt:=xlPart, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlNext, _
MatchCase:=False).Activate
Zeile$ = ActiveCell.Address

Zeile$ = Mid$(ActiveCell.Address, 3)
–> Rows(i & „:“ & i).Select
Selection.Copy
Sheets(„Suchergebnis“).Select
–> Rows(i & „:“ & i).Select

ActiveSheet.Paste
–> next
End Sub

Bis Zeile 7 ist der Tabellenkopf. Daher sollen die Zeilen ab
Zeile 8 kopiert und eingefügt werden. Diese Formel klappt ganz
gut, wenn es nur eine Zeile betrifft. Taucht nun das
Schagwort Auto in bspw. Zeile 8, 20, 50 und 100 auf, brauche
ich irgendeine Schleife, dass diese Zeilen im Tabellenblatt
„Suchergebnis“ in Zeile 8-11 kopiert werden.

Wie muss eine Schleifen-Funktion aussehen, damit dies
funktioniert?

Hallo,

ich habe oben die Zeilen markiert, in denen ich jeweils etwas geändert habe (–&gt:wink:. Mit einer For Next Schleife kann man die Tabellenzeilen der Reihe nach durchgehen und pro Zeile dann alle Spalten durchsuchen lassen. Mit der Variable „i“ (Zahl=Long), werden jeweils im Schritten von 1 ab der Zeile 8 mit For Next alle Zeilen durchgegangen. Ein Tabellenblatt enthält ca. 65000 Zeilen, falls die Zeilenanzahl kleiner ist, kann man den Wert auch runtersetzen bzw. könnten man auch überprüfen ober es sich um eine charakteristische Endzeile handelt und dann die Schleife unterbrechen. Ich hoffe das funktioniert auch in der Praxis bei Ihnen. Sie können mich gerne auch per Email kontaktieren, falls Sie noch Fragen haben sollten, oder Probleme mit der Umsetzung. Eventuell können Sie mir dann auch eine Beispieldatei zukommen lassen. Sie erreichen mich unter asfast-edv"at"t-online.de.

Viele Grüße
Andreas Fastner

Hallo,

ich schleppe mich schon einige Tage damit herum, daß ich auf Deine Anfrage antworten muß (aus Höflichkeit, nicht nur wegen der Forumsregeln).

Und ich muß Dir leider sagen: ich kann Dir nicht helfen. Grund:

Ich bin, wie so viele hier, reiner Autodidakt. Mein Wissen habe ich dadurch erworben, daß ich auf erfahrene Leute gehört habe. Am meisten gelernt habe ich von diesen Erfahrenen (die ihr Handwerk von der Pike auf gelernt haben), wenn sie darauf achten, daß die Programme auch „by the book“ angewandt werden.

Wenn es in Deiner Anfrage heißt, daß ab Zeile7 der Tabellenkopf beginnt, ist für mich erstmal schon Ende. So etwas gehört entweder in eine Datenbankanwendung oder in ein korrekt angewandtes Excel.

So etwas gibt es bei korrekt angewandtem Excel nicht (guck Dir mal an, was man mit Daten > Maske alles machen kann). Ich will Deinen Ansatz nicht fördern, denn er macht keinen Unterschied zwischen Daten und ihrem Container.

Wenn Du beruflich zu diesem Ansatz gezwungen bist: umso schlimmer. EDV-Abteilungen sind dazu da, produktiv zu sein, nicht krude oder abseitige Eigenlösungen zu etablieren.

Deinen Ansatz fördern kann ich auch nicht, weil ich dazu eine Beispielmappe bräuchte. Das, was Du schreibst, sagt mir 'was, aber halt für mich zu wenig, um einen Workaround vorzuschlagen.

Trotzdem schöen Feiertage und einen guten Rutsch.

Markus

In Deinem Code fehlt schonmal eine Schleife, um ALLE Werte zu finden. Soweit ich den Code verstehe wird er dir immer nur den ersten Wert zurückgeben (habe es aber nicht ausgetestet) also so etwas in der folgenden Form:

With Worksheets(1).Range(„a1:a500“)
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext©
Loop While Not c Is Nothing And c.Address firstAddress
End If
End With

Wenn du dann alle gefunden Zeilen in dein neues Tabellenblatt kopieren möchtest, dann solltest du noch eine Variable deklarieren, in der du dir immer die zeile merkst, in die etwas in „Suchergebnis“ gespeichert werden soll.

Also z.B.
Dim lRow as Long 'z.B. als globale Variable

lRow=8 ’ in deiner Sub Auto_Aktiviert

'ab hier dann in deiner Schleife, wo du alle Werte suchst
Rows(lRow & „:“ & lRow).Select
lRow = lRow + 1 'erhöhen, damit der nächste Wert in eine neue Spalte kopiert wird
ActiveSheet.Paste

Noch ein kurzer Nachtrag: nach deinem Schema bekommst du aber ein Problem, wenn es den Wert mehrfach in einer Zeile geben kann -> dann wird die Zeile auch mehrfach kopiert. Das müsstest du noch abfangen, falls es vorkommen kann