Zellen filtern und löschen, wirft Fehlermeldung au

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Zellen filtern und löschen, wirft Fehlermeldung au
von: Niko
Geschrieben am: 01.10.2015 12:59:09

Hallo liebe Community,

ich bin ein VBA Neuling und nutze folgenden Code, um einen Bericht zu filtern und nicht benötigte Daten zu löschen. Wobei WS1 als das entsprechende Tabellenblatt definiert ist:

1 With WS1
2 .Range("A1").AutoFilter Field:=5, Criteria1:="Client"
3 .Range("A1").AutoFilter Field:=6, Criteria1:="<>Rate"
4 .Rows(1).Hidden = True
5 .UsedRange.SpecialCells(xlCellTypeVisible).Delete
6 .Rows(1).Hidden = False
7 .AutoFilterMode = False
8 End With
9 With WS1
10 .Range("A1").AutoFilter Field:=7, Criteria1:=Array( _
11 "Internal use", "Information inquiry"), Operator:=xlFilterValues
12 .Rows(1).Hidden = True
13 .UsedRange.SpecialCells(xlCellTypeVisible).Delete
14 .Rows(1).Hidden = False
15 .AutoFilterMode = False
16 End With

Das Problem ist, dass ich eine Fehlermeldung bekomme, wenn der Filter keine Ergebnisse liefert. Bzw. nichts gelöscht werden kann:
"Laufzeitfehler '1004': Keine Zellen gefunden"

Der Fehler bezieht sich auf Zeile 5 bzw. 13.

Meine Frage: Wie kann ich dafür sorgen, dass das Skript weiter ausgeführt wird auch wenn keine Zeilen zu löschen sind?

Danke für die Hilfe

Bild

Betrifft: zu Beginn: On Error Resume Next
von: Matthias L
Geschrieben am: 01.10.2015 13:01:33
Hallo
Was aber dann keine Fehler mehr anzeigt sondern alle überspringt
Gruß Matthias

Bild

Betrifft: AW: zu Beginn: On Error Resume Next
von: Niko
Geschrieben am: 01.10.2015 13:06:02
Hallo,
Danke! Das schreibe ich vor die Schleife?
Kann ich das danach wieder aufheben?
Gruß Niko

Bild

Betrifft: On Error GoTo Fehler
von: Matthias L
Geschrieben am: 01.10.2015 13:16:59
Hallo
Beispiel:(hier mit Tabelle1)
somit springt der Code bei einem Fehler zur Sprungmarke
und klappert die Zeilen garnicht erst ab.

Option Explicit
Sub Filter()
Dim WS1 As Worksheet
Set WS1 = Tabelle1
On Error GoTo Fehler
With WS1
 .Range("A1").AutoFilter Field:=5, Criteria1:="Client"
 .Range("A1").AutoFilter Field:=6, Criteria1:="<>Rate"
 .Rows(1).Hidden = True
 .UsedRange.SpecialCells(xlCellTypeVisible).Delete
 .Rows(1).Hidden = False
 .AutoFilterMode = False
End With
With WS1
 .Range("A1").AutoFilter Field:=7, Criteria1:=Array("Internal use", "Information inquiry"),  _
Operator:=xlFilterValues
 .Rows(1).Hidden = True
 .UsedRange.SpecialCells(xlCellTypeVisible).Delete
 .Rows(1).Hidden = False
 .AutoFilterMode = False
End With
Exit Sub
Fehler:
MsgBox "Es sind keine Daten vorhanden"
On Error GoTo 0
End Sub
Warum hattest Du überall Zahlen vor dem Code stehen?
Und warum beendest Du das With-Konstrukt und setzt es gleich wieder neu?
Müsste doch auch mit 1x With funktionieren
also nach diesem Motto
With WS1
 .Range("A1").AutoFilter Field:=5, Criteria1:="Client"
 .Range("A1").AutoFilter Field:=6, Criteria1:="<>Rate"
 .Rows(1).Hidden = True
 .UsedRange.SpecialCells(xlCellTypeVisible).Delete
 .Rows(1).Hidden = False
 .AutoFilterMode = False
 .Range("A1").AutoFilter Field:=7, Criteria1:=Array("Internal use", "Information inquiry"),  _
Operator:=xlFilterValues
 .Rows(1).Hidden = True
 .UsedRange.SpecialCells(xlCellTypeVisible).Delete
 .Rows(1).Hidden = False
 .AutoFilterMode = False
End With

Gruß Matthias

Bild

Betrifft: AW: On Error GoTo Fehler
von: Niko
Geschrieben am: 01.10.2015 13:32:03
Die Zahlen hatte ich nur zur Zeilenbenennung davor stehen, damit der geneigte Leser weiß, worauf ich anspiele.
Stimmt, es geht auch mit einmal with ^^
Bin ein Neuling und arbeite aktuell hauptsächlich mit zusammengesuchten code schnipseln, da kommt sowas schon mal vor. Danke für den Hinweise!
Ich habe in dem gleichen Modul noch weitere Schleifen und möchte, dass - sollte woanders ein Fehler auftreten - mir dieser noch angezeigt wird.
Daher habe ich das "On Error goTo next" jetzt in das with Konstrukt vor die erste Filter Anweisung gesetzt.
Funktioniert das so?
Gruß NIko

Bild

Betrifft: AW: On Error GoTo Fehler
von: Matthias L
Geschrieben am: 01.10.2015 14:07:51
Hallo
On Error goTo next habe ich nicht vorgeschlagen.
Ich schrieb im letzten Beitrag:
On Error GoTo Fehler
Das heißt wenn ein Fehler auftritt springt der Code zur Sprungmarke Fehler


'... Code
Fehler:'<-Sprungmarke
 MsgBox "Es sind keine Daten vorhanden"'<-das kann man auch weglassen
On Error GoTo 0 '<-Fehler zurücksetzen
'... weiterer Code

Wenn der Fehler mit On Error GoTo 0 zurückgesetzt wurde
kann ja weiterer Code ausgeführt werden. Es werden auch wieder andere Fehler angezeigt.
Gruß Matthias

Bild

Betrifft: AW: On Error GoTo Fehler
von: Daniel
Geschrieben am: 01.10.2015 20:25:12
Hi Folks
wenn man hier mit On Error Goto arbeiten will dann so, denn schließlich sollte doch der zweite Teil zum Löschen auch dann ausgeführt werden, wenn der erste Teil keine Zeilen zum Löschen findet.
der Fehler ist ja hier kein echter logischer Fehler, sondern eher ein Bug in der SpecialCells-Funktion, denn ob die Zeilen jetzt nicht mehr da sind, weil sie gelöscht wurden oder weil sie noch nie da waren, spielt für das Ergebnis keine Rolle.

With WS1
    .Range("A1").AutoFilter Field:=5, Criteria1:="Client"
    .Range("A1").AutoFilter Field:=6, Criteria1:="<>Rate"
    .Rows(1).Hidden = True
    
    On Error Goto Sprung1
    .UsedRange.SpecialCells(xlCellTypeVisible).Delete
Sprung1:
    On Error GoTo 0
    
    .Rows(1).Hidden = False
    .AutoFilterMode = False
End With
With WS1
    .Range("A1").AutoFilter Field:=7, _
        Criteria1:=Array("Internal use", "Information inquiry"), _
        Operator:=xlFilterValues
    .Rows(1).Hidden = True
    
    On Error Goto Sprung2
    .UsedRange.SpecialCells(xlCellTypeVisible).Delete
Sprung2:
    On Error GoTo 0
    
    .Rows(1).Hidden = False
    .AutoFilterMode = False
End With
und weil hier ja nur eine Zeile übersprungen wird, kann man auch gleich On Error Resume Next verwenden.
With WS1
    .Range("A1").AutoFilter Field:=5, Criteria1:="Client"
    .Range("A1").AutoFilter Field:=6, Criteria1:="<>Rate"
    .Rows(1).Hidden = True
    
    On Error Resume Next
    .UsedRange.SpecialCells(xlCellTypeVisible).Delete
    On Error GoTo 0
    
    .Rows(1).Hidden = False
    .AutoFilterMode = False
End With
With WS1
    .Range("A1").AutoFilter Field:=7, _
        Criteria1:=Array("Internal use", "Information inquiry"), _
        Operator:=xlFilterValues
    .Rows(1).Hidden = True
    
    On Error Resume Next
    .UsedRange.SpecialCells(xlCellTypeVisible).Delete
    On Error GoTo 0
    
    .Rows(1).Hidden = False
    .AutoFilterMode = False
End With
Gruß Daniel

Bild

Betrifft: AW: Prüfen, ob Zeilen zum Löschen da sind
von: Daniel
Geschrieben am: 01.10.2015 20:01:40
Hi
das Problem an der Sache ist, das das .SpecialCells einen Fehlerabbruch verursacht, wenn es keine Zellen finden kann.
dh du solltest, bevor du das .Specialcells zum löschen anwendest, überprüfen ob es überhaupt zeilen gibt, die gelöscht werden müssen.
das machst du, indem du mit .SpecialCells(xlcelltypevisible) die sichtbaren Zeilen zählst und zwar bevor du die Überschrift ausblendest.
Dann ist nämlich mindestens eine Zeile sichtbar und das das .SpecialCells(xlcelltypevisible) wird nie einen Fehler erzeugen.
Wenn dann die Anzahl der sichtbaren Zeilen = 1 ist, weisst du dass nur die Überschriftenzeile sichtbar ist und somit keine Zeilen gelöscht werden müssen:

With WS1
    .Range("A1").AutoFilter Field:=5, Criteria1:="Client"
    .Range("A1").AutoFilter Field:=6, Criteria1:="<>Rate"
    If .UsedRange.Columns(1).Cells.Count > 1 Then
        .Rows(1).Hidden = True
        .UsedRange.SpecialCells(xlCellTypeVisible).Delete
        .Rows(1).Hidden = False
    End If
    .AutoFilterMode = False
End With
With WS1
    .Range("A1").AutoFilter Field:=7, _
                    Criteria1:=Array("Internal use", "Information inquiry"), _
                    Operator:=xlFilterValues
    If .UsedRange.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then
        .Rows(1).Hidden = True
        .UsedRange.SpecialCells(xlCellTypeVisible).Delete
        .Rows(1).Hidden = False
    End If
    .AutoFilterMode = False
End With
das von den Kollegen vorgestellte On Error Goto ist hier im Prinzp nur eine Notlösung, wenn man keine Möglichkeit hat, die Fehlerursache vorher abzufragen oder wenn dies sehr kompliziert wäre.
Aber hier ist es ja sehr einfach und daher sollte man das auch tun und das On Error Goto für "schwere Fälle" aufsparen.
Gruß Daniel

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Zellen filtern und löschen, wirft Fehlermeldung au"