Vba

Liebe/-r Experte/-in,
wer kann mir helfen, Kopf raucht schon, Danke im vorraus! Muss weiter im Buch lesen.

Sub mitAutofilterLöschen()

Range(„J2“).Select
Selection.AutoFilter Field:=3, _
Criteria1:=„Linearmodul L16*“
Range(„A1“).CurrentRegion.Offset(1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete
Rows(„2:2“).Select
Selection.AutoFilter Field:=3

Range(„J2“).Select
Selection.AutoFilter Field:=3, _
Criteria1:=„Ventilinsel*“
Range(„A1“).CurrentRegion.Offset(1).SpecialCells _
(xlCellTypeVisible).EntireRow.Delete
Rows(„2:2“).Select
Selection.AutoFilter Field:=3

Ich habe eine Stückliste mit 3000 Zeilen, diese filtere ich mit obigen Filter.

Die 7 Zeilen kopiere ich, ändere das Criterium das ist mein Filter.
Problem: Nachdem ich meinen Filter immer wieder verlängert habe, bekomme ich Fehlermeldung Prozedur zu lange.
Frage: Kann die Criterien einfach in eine Tabelle schreiben, mit Range den Bereich angeben und das ganze in eine Schleife abarbeiten lassen?
Ein Criterium nach dem anderen in die Schleife übergeben, mit dem Autofilter filtern,löschen, next Criterium.

Für Hilfe bin ich dankbar.

Schönens Wochenende wünscht
Hans

Ja klar geht das.
Lege ein neuse Tabellenblatt an, schreibe da untereinander dien Filterkriterien rein.
Dann musst du nur noch für jedes Kriterium deine Filtermethode aufrufen und an der Stelle eine Variable immer mit dem aktuellen Kriterium belegen.

Criteria1:= variable +"*"

die Schleife wirst du sicher hinbekommen :smile:

D.

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Problem sollte lösbar sein.
kannst du mir das ganze programm schicken?
komme noch nicht ganz dahinter was das Ziel ist.
eine genauere umschreibung wäre auch hilfreich.

jochen11

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Sub SelectNachFilterListe()

'Markieren von x Zeilen in einer weiteren Tabellle
'die die zu löschenden Filterkriterien enthalten
'dann dieses Makro starten

v_Liste = Selection 'Pos der ausgewählten Kritereien merken
Sheets(„Daten“).Select 'tabelle mit den Daten aktivieren

For Each v_Pos In v_Liste 'jetzt für Anzahl der Zeilen mit Kritereien

'für Suche nach Beginnt mit
SuchStr = „=“ & v_Pos & „*“

'für Suche nach enhält
'SuchStr = „=*“ & Auswahl.Offset(1).Offset(1, 1).Value2 & „*“

'für Suche nach entsprucht
'SuchStr = „=“ & Auswahl.Offset(1).Offset(1, 1).Value2

ActiveSheet.Range("$A$1:blush:D$1").AutoFilter Field:=4, Criteria1:=SuchStr

’ —> Jetzt löschen Bearbeiten oder was sonst noch.

Next v_Pos

End Sub

Hallo Jochen,
Die Liste besteht aus 3000 Atikel. Für meinen Wartungsplan sind nur ca. 150 Atikel von Bedeutung.
So möchte ich alle anderen Artikel mit einem vorgefertigten Filter löschen. Ich habe jede 2. Woche eine neue Liste zu bearbeiten mit ähnlichen Teilen. So dachte ich die Kriterien schreibe ich alphabetisch in eine Liste, ständig erweiterbar, leise diese in eine Schleife ein, mit dem Autofilter suche ich dieses Kriterium und lösche diese. Die Artikelliste Exceltabelle schicke ich gerne, bräuchte nur Ihre E-Mail Addresse. Schönes Wochenende aus dem Berchtesgadener Land.
Hans

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

hello again
meine e-mailadresse:
[email protected]

also kurz zusammengefasst.
du hast eine vorgefertigte liste aus zirka 3000 artikeln.
und irgendwo in einer spalte hast du eine liste mit diesen zirka 150 artikeln.
und nun möchtest du ein makro, dass die 3000 durchsucht und alle ausser diese 150 löscht?
oder umgekehrt?
auf jedenfall sollte das schon klappen.
michi aus der schönen Schweiz :stuck_out_tongue:

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Hans,

leider kann ich dir nicht weiterhelfen. Hoffe jemand kann dein Problem lösen.

Gruß
Andreas

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo T. Wagner

Hallo T.Wagner,

leider bleibt das Makro in Sheets(„Daten“).Select…
stehen (Index außerhalb des gültigen Bereichs Laufzeitfehler)
Kann ich den Pfad zu den Kriterien direkt angeben?

Mit freundliche Grüßen
Hans

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ja klar geht das.
Lege ein neuse Tabellenblatt an, schreibe da untereinander
dien Filterkriterien rein.
Dann musst du nur noch für jedes Kriterium deine Filtermethode
aufrufen und an der Stelle eine Variable immer mit dem
aktuellen Kriterium belegen.

Criteria1:= variable +"*"

die Schleife wirst du sicher hinbekommen :smile:

Hallo Nick aus Berlin,
gibts da noch ne Starthilfe.
Bin überhaupt kein Schleifenexperte

Viele Grüße Hans

Excel-Filter

Hallo,

meine Erfahrung mit Filtern ist, dass diese auf übergebene Zellwerte nicht so recht reagieren. Daher hab ich bei Löschprozeduren zeilenweise abgearbeitet, d. h. nicht Filter - Löschen - Filter - Löschen, sondern Zeile prüfen - Löschen/nicht Löschen - nächste Zeile.

Hilft das weiter?

Viele Grüße,

André

Hi Hans, ich hoffe du kannst was mit den folgenden Ausführungen anfangen…
Wenn nicht, meld dich einfach nochmal… aber das Prinzip sollte jetzt klar sein…
Ach so… zeilen die mit einem Hochkomma ’ anfangen sind Kommentare alle anderen Programmzeilen, die funktionieren sollten.

D.

Sub Makro1()

'Auf das Tabellenblatt mit den Kriterien wechseln…
'hier sollten die Kriterien untereinander in A1 bis An stehen.
'Bei 5 Kriterien eben A1, A2, A3, A4, A5
Sheets(„TabKriterien“).Select

'Definition der Variable in der dann später die Anzahl der Kriterien steht
Dim lastRow As Long

'Nächste Zeile bestimmt die letzte Reihe, in der noch etwas steht.
'(Achtung das Arbeitsblatt muss TabKriterien heissen, wenn du den Code hier benutzt
'wenn das Arbeitsblatt anders heisst, dann muss das natürlich angepast werden)
lastRow = IIf(IsEmpty(Worksheets(„TabKriterien“).Cells(Rows.Count, 1)), Worksheets(„TabKriterien“).Cells(Rows.Count, 1).End(xlUp).Row, Rows.Count)

'jetzt haben wir in lastRow z.B. 5 stehen (bei 5 Kriterien)
'fo-Next durchläuft jetzt die schleife so lange, bis in der Variable i fünf steht. also erst eins,
'dann zwei, dann 3 und dann 4 und 5. danach bricht die schleif ab. Der Code der zwischen FOR und NEXT steht
’ wird also genau so oft ausgeführt, wie viele Kriterien du in TabKriterien stehen hast.

For i = 1 To lastRow
'hier wird jetzt wieder eine Variable für eine Zeichenkette angelegt
Dim copyVariable As String
'Dann das Arbeitsblatt selektiert auf dem deine Kriterien stehen
Sheets(„TabKriterien“).Select
'Hier ist jetzt der Trick :wink: beim ersten schleifendurchlauf steht in der Laufvariable i
’ eins (1) d.h. die Variable „copyVariable“ wird jetzt mit dem Wert aus der Zelle A1 belegt.
'beim zweiten durchlauf steht i auf 2, also wird der Inhalt der Zelle A2 ausgelesen.
copyVariable = Range(„A“ & i).Value

'Jetzt selektierst du das Datenblatt auf dem du arbeiten willst (hier z.B. Tabelle 2)
Sheets(„Tabelle2“).Select
'und führst deinen Code aus
Range(„J2“).Select
'und hier kannst du jetzt die Variable copyVariable (oder wie auch immer du sie nennen willst benutzen
Selection.AutoFilter Field:=3, _
Criteria1:=copyVariable & „*“
Range(„A1“).CurrentRegion.Offset(1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete
Rows(„2:2“).Select
Selection.AutoFilter Field:=3
'Nächste Schleife…
Next i
End Sub

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Tabelle mit den Kriterien als neue Tabelle in die Datei mit deinen Daten.
Und „Daten“ im Makro ändern gegen den Namen den deine Datentabelle hat z.B. „Tabelle1“ oder umbenenne in „Daten“

T. wagner

Hallo Nick,

stell Dir vor, das Makro läuft.

Vielen, vielen Dank dafür.

Hallo Herr T.Wagner

nachdem ich eine neue Tabelle mit den Namen Daten eingefügt habe läuft das Makron nun bis

ActiveSheet.Range("$A$1:blush:D$1").AutoFilter Field:=4, Criteria1:=SuchStr
Meldung: Methode des Range Objektes konnte nicht ausgeführt werden.
Ich habe den Code kopiert, sollt kein Schreibfehler vorhanden sein.
Unten habe ich das Makro reinkopiert.
Viele Grüße aus dem Berchtesgadener Land

Sub SelectNachFilterListe()
't.wagner

v_Liste = Selection 'Pos der ausgewählten Kritereien merken
Sheets(„Daten“).Select 'tabelle mit den Daten aktivieren

For Each v_Pos In v_Liste 'jetzt für Anzahl der Zeilen mit Kritereien

'für Suche nach Beginnt mit
SuchStr = „=“ & v_Pos & „*“

'für Suche nach enhält
'SuchStr = „=*“ & Auswahl.Offset(1).Offset(1, 1).Value2 & „*“

'für Suche nach entspricht
'SuchStr = „=“ & Auswahl.Offset(1).Offset(1, 1).Value2

ActiveSheet.Range("$A$1:blush:D$1").AutoFilter Field:=4, Criteria1:=SuchStr

'Range(„J2“).Select
’ Selection.AutoFilter Field:=3, _
’ Criteria1:=„Linearmodul L16*“
Range(„A1“).CurrentRegion.Offset(1). _
SpecialCells(xlCellTypeVisible).EntireRow.Delete
Rows(„2:2“).Select
Selection.AutoFilter Field:=3

Next v_Pos

End Sub

Das einfachste ist die Zeile/Bereich mit den Autofiltern
mit einem Namen zu versehen (CtrlF3) und diesen dann anstatt „$A$1:blush:D$1“ in das Makro einzusetzen.

Field:4 muss dann Field:x Nr der wievielten Spalte das Kriterium eingesetzt werden soll.

Hallo nochmal,

Wochenende, Zeit für VBA. Ich habe nun die Spalte 9(I1)markiert und (STRG +F3) Spalte heißt Bezeichnung. Diese nun in das Makro eingesetzt.
ActiveSheet.Range(„Bezeichnung“).AutoFilter Field:=9, Criteria1:=SuchStr
Läuft leider nicht.
Laufzeitfehler 1004, Anwendungs oder objektorientierter Fehler. in dieser Zeile.
Auf jeden Fall schönes Wochenende.

Viele Grüße
H

Hallo nochmal,
Vielen Dank nochmal, Makro läuft super.
Frage wo lernt man das? Ich arbeite mich gerade durch VBA in 14 Tagen durch. Gibt es irgendwo gut Unterlagen.
Habe an Ihr Makro noch etwas angehängt, das eigenständig in einem Modul läuft, doch angehängt den Fehler Integer…bereites vorhanden. Fehler… bringt.

Sub löschenbisaufRegisterTabelle1()

Dim I As Integer
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For I = ActiveWorkbook.Worksheets.Count To 1 Step -1
If Worksheets(I).Name „Gesamt_Stückliste“ Then _
Worksheets(I).Delete
Next I
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Viele Grüße aus dem regnerischen BGL
Gruß H

nicht nur das Feld / geschweige die Spalte in dem gesucht wird.
Wenn deine Filter in B1:I1 aktiv sind, dann diese markieren und bezeichnen.
Dann ist Field: nicht 9 sonder 8. das 8 Filterfeld der aktiven Filter.

Wenn du mir mails sende ich dir ein Beispiel, auch mit einer alternative, ohne Filter und mit der möglichkeit der Kennzeichnung anstatt löschen. Wenn man das mögliche Ergebniss dann überprüft hat, kann man das löschen laufen lassen.

Wagner
AT inotronics.de

Hallo Herr Wagner,
Anbei meine E-Mail:
[email protected]
Ich kann Ihnen leider in dieser Maske kein Stückliste zukommen lassen.
Für eine Lösung bin ich dankbar.

Viele Grüße

Hans

Nur zum Löschen der bei mir noch offenen Anfrage!