Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

wenn Autofilter kein Ergebnis dann weiter

Forumthread: wenn Autofilter kein Ergebnis dann weiter

wenn Autofilter kein Ergebnis dann weiter
20.07.2018 10:52:11
Günter
Hallo,
ich habe in einem Makro einen Autofilter eingebaut und kopiere die gefilterten Daten in ein anderes Tabellenblatt. Bisher alles gut. Nur habe ich jetzt das Problem, dass der Autofilter kein Ergebnis liefert, was auch okay ist.
Die weitere Verarbeitung läuft auf Fehler. (Makro bricht ab).
In dem Fall soll aber die folgende Verarbeitung nicht ausgeführt werden.
Anbei ein Auszug aus dem Quellcode:
Quellcode-Beginn
'P2S BASIS
Sheets("Systemdaten_PVS").Select
Range("A1:f" & Cells(Rows.Count, 1).End(xlUp).Row).AutoFilter Field:=1, Criteria1:="SAP_BASIS"
Range("A1:f" & Cells(Rows.Count, 1).End(xlUp).Row).AutoFilter Field:=6, Criteria1:="P2S-500"
ActiveSheet.Range("c2:c" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Copy
Sheets("Systemarbeiten").Select
Range("c4").Select
ActiveSheet.Paste
Quellcode-Ende
In diesem Fall gibt es für das Kriterium "P2S-500" kein Ergebnis.
Es soll also der nachfolgende Quellcode nicht ausgeführt werden.
Gruß
Günter
Anzeige

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

Betreff
Datum
Anwender
Anzeige
AW: wenn Autofilter kein Ergebnis dann weiter
20.07.2018 11:00:59
UweD
Hallo
vor dem copy zählen...

If WorksheetFunction.Subtotal(3, Columns(1)) = 1 Then ' oder 1, wenn die Spalte keine Ü _
berschrift hat
MsgBox "Filterfehler"
Exit Sub
End If
benutzt das Teilergebnis Anzahl2()
LG UweD
AW: wenn Autofilter kein Ergebnis dann weiter
20.07.2018 11:15:40
Daniel
Hi
ob dein Autofilterergebnis leer ist oder nicht, kannst du nach Anwenden des Filters so prüfen:
if Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)).SpecialCells(xlcelltypevisible).Count > 1 Then
damit Zählst du die Anzahl der sichtbaren Zellen in der ersten Spalte. Da die Überschriftenzeile mit dabei ist und diese immer sichtbar ist, findet das .SpecialCells auf jeden Fall einen Wert und du bekommst keinen Fehlerabbruch, wenn der Autofilter nichts findet.
um vor anwenden des Filters zu prüfen, ob ein Ergebnis vorhanden ist, kann man ZählenWenns bzw Worksheetfunction.CountIfs verwenden.
Hier mal der Code dafür mit ein paar weiteren Optimierungen:
With Sheets("Systemdaten_PVS").Select
With .Range("A1:f" & .Cells(.Rows.Count, 1).End(xlUp).Row)
If Worksheetfunction.CountIfs(.columns(1), "SAP_BASIS", .Columns(6), "P2S-500") then     _
.AutoFilter Field:=1, Criteria1:="SAP_BASIS"
.AutoFilter Field:=6, Criteria1:="P2S-500"
.Columns(3).Offset(1, 0).SpecialCells(xlCellTypeVisible).Copy
Sheets("Systemarbeiten").Range("c4").PasteSpecial xlpasteAll
end if
end with
end with
am einfachsten wäre jedoch folgende Lösung:
kopiere einfach die erste Leerzeile unterhalb des Autofilters mit.
Diese ist immer sichtbar, damit findet das .SpecialCells(xlcelltypevisible) auch dann eine Zeile, wenn alles andere ausgeblendet ist.
Da die Zeile leer ist, stört sie auch nicht weiter:
ActiveSheet.Range("c2:c" & ActiveSheet.UsedRange.Rows.Count + 1).SpecialCells(xlCellTypeVisible).Copy
Gruß Daniel
Anzeige
AW: wenn Autofilter kein Ergebnis dann weiter
20.07.2018 13:18:19
Günter
Hallo UweD,
Hallo Daniel,
vielen Dank für Eure schnellen Rückmeldungen.
Ich habe mich für die schnelle Lösung von Daniel entschieden, die mir sehr geholfen hat..
Die anderen Lösungen werde ich mir in Ruhe ansehen.
Viele Grüße
Günter
Anzeige
Anzeige

Infobox / Tutorial

Autofilter in Excel VBA: Fehlerbehebung bei leeren Ergebnissen


Schritt-für-Schritt-Anleitung

  1. Autofilter anwenden: Verwende den Autofilter, um Daten in deinem Excel-Sheet zu filtern. Hier ein grundlegendes Beispiel:

    Sheets("Systemdaten_PVS").Range("A1:F" & Cells(Rows.Count, 1).End(xlUp).Row).AutoFilter Field:=1, Criteria1:="SAP_BASIS"
  2. Anzahl sichtbarer Zellen prüfen: Bevor du die gefilterten Daten kopierst, überprüfe, ob es sichtbare Zellen gibt. Dies kannst du mit SpecialCells(xlCellTypeVisible).Count tun:

    If ActiveSheet.Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count > 1 Then
       ' Kopiere die Daten
    Else
       MsgBox "Keine Daten gefunden!"
       Exit Sub
    End If
  3. Daten kopieren: Wenn Ergebnisse vorhanden sind, kopiere die Daten in ein anderes Tabellenblatt:

    ActiveSheet.Range("C2:C" & ActiveSheet.UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Copy
    Sheets("Systemarbeiten").Range("C4").PasteSpecial xlPasteAll

Häufige Fehler und Lösungen

  • Fehler: Makro bricht ab, wenn der Autofilter keine Ergebnisse liefert.

    • Lösung: Füge eine Überprüfung hinzu, die die Anzahl der sichtbaren Zellen zählt, bevor du die Daten kopierst, wie im obigen Schritt beschrieben.
  • Fehler: Fehlermeldung bei .SpecialCells wenn keine sichtbaren Zellen vorhanden sind.

    • Lösung: Verwende die Count-Funktion von SpecialCells, um sicherzustellen, dass es sichtbare Zellen gibt.

Alternative Methoden

  1. Zählen mit COUNTIFS: Nutze WorksheetFunction.CountIfs, um vor dem Autofilter zu überprüfen, ob Ergebnisse vorhanden sind. Hier ein Beispiel:

    If WorksheetFunction.CountIfs(Sheets("Systemdaten_PVS").Range("A:A"), "SAP_BASIS", Sheets("Systemdaten_PVS").Range("F:F"), "P2S-500") > 0 Then
       ' Anwenden des Autofilters
    End If
  2. Leere Zeile kopieren: Wenn du sicherstellen möchtest, dass immer mindestens eine Zeile kopiert wird, kannst du die erste Leerzeile unterhalb des Autofilters einfügen:

    ActiveSheet.Range("C2:C" & ActiveSheet.UsedRange.Rows.Count + 1).SpecialCells(xlCellTypeVisible).Copy

Praktische Beispiele

Hier ist ein vollständiges Beispiel für ein Makro, das den Autofilter anwendet und die Daten kopiert, während Fehler vermieden werden:

Sub FilterAndCopyData()
    With Sheets("Systemdaten_PVS")
        .Range("A1:F" & .Cells(.Rows.Count, 1).End(xlUp).Row).AutoFilter Field:=1, Criteria1:="SAP_BASIS"
        .Range("A1:F" & .Cells(.Rows.Count, 1).End(xlUp).Row).AutoFilter Field:=6, Criteria1:="P2S-500"

        If .Range("A1:A" & .Cells(.Rows.Count, 1).End(xlUp).Row).SpecialCells(xlCellTypeVisible).Count > 1 Then
            .Range("C2:C" & .UsedRange.Rows.Count).SpecialCells(xlCellTypeVisible).Copy
            Sheets("Systemarbeiten").Range("C4").PasteSpecial xlPasteAll
        Else
            MsgBox "Keine Daten gefunden!"
            Exit Sub
        End If
    End With
End Sub

Tipps für Profis

  • Verwendung von Subtotal: Nutze die Funktion WorksheetFunction.Subtotal(3, ...), um die Anzahl gefilterter Zeilen zu ermitteln und Fehler zu vermeiden.

  • Optimierung durch With-Anweisungen: Verwende die With-Anweisung, um den Code lesbarer und effizienter zu gestalten.

  • Fehlerbehandlung: Implementiere eine umfassende Fehlerbehandlung, um unerwartete Abstürze des Makros zu vermeiden.


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass mein Makro nicht abbricht, wenn der Autofilter leer ist?
Verwende SpecialCells(xlCellTypeVisible).Count, um die Anzahl der sichtbaren Zellen zu überprüfen, bevor du die Daten kopierst.

2. Was kann ich tun, wenn ich mehrere Filterkriterien verwenden möchte?
Nutze WorksheetFunction.CountIfs, um mehrere Kriterien zu überprüfen, bevor du den Autofilter anwendest.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige