Nicht Löschen, wenn keine Daten vorhanden

  • Excel

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von sayb.

    Nicht Löschen, wenn keine Daten vorhanden

    Hallo und guten Morgen zusammen,

    ich bin von meinem Chef beauftragt worden, ein kleines Makro im Excel 2010 zum schnellen Aussortieren einer längeren Liste zu erstellen.
    Von Visual Basic hatte ich bis Dato keine Ahnung.Also habe ich mich gestern mal ein bisschen eingelesen und auch ein halbwegs funktionierendes Makro zustande gebracht.

    Ziel ist es, in ein vorgefertigtes Dokument jeden Tag eine bestimmte Liste einzufügen, deren Inhalt jeden Tag variabel ist.

    Anschließend sollen nicht benötigte Inhalte entfernt werden.

    Ich habe das ganze so gemacht:

    Range("H2").Select
    Selection.AutoFilter
    Selection.AutoFilter Field:=8, Criteria1:="=*Nom*", Operator:=xlAnd
    Range("A3").Select
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    Selection.EntireRow.Delete
    Selection.AutoFilter Field:=8
    Selection.AutoFilter


    So weit hat auch alles funktioniert.


    Das Problem das Auftritt:
    Ich hatte jetzt eine Liste, in der unter "Field=8" kein "*Nom*" enthalten war.
    Also hatte er keine Ergebnise, markiert meine Filterzeile (H2, bzw. 2:2) und löscht diese.
    Diese ist aber für die weiteren Arbeitsschritte unbedingt von Nöten.

    Was ich suche ist ein Befehl wie "Wenn keine Daten vorhanden, dann nicht löschen".

    Gibt es sowas? Wenn ja wie geht das?

    Für Lösungsvorschläge bedanke ich mich schonmal im Vorraus ;)


    Grüße


    Edit by Dodo:
    -> Topic verschoben (Grundlagen => VBA)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Dodo“ ()

    Wie gesagt, ich bin absolut neu im Thema VB durch meinen neuen Arbeitsplatz und eigentlich gehört es nicht zu meinem Aufgabenbereich, war nur ein kleines "Extra" worum ich gebeten wurde.

    Recht viel mehr Code hab ich eigetnlich nicht.

    Der Sinn meines Codes ist eigentlich einfach nur:
    "Filtere aus einer der 9 Spalten alles heraus, was "nom" enthält, markiere die Ergebnisse und lösche sie."

    Macht er soweit auch, nur wenn in der Spalte nichts mit "nom" enthalten ist, kommen demzufolge keine Ergebnisse aus dem Filter.
    Dann markiert er mir die Zeile, indem der AutoFilter gesetzt wurde und löscht diese.

    Diese Zeile befindet sich in Zeile 2.
    Zum löschen markiert habe ich alles ab A3 abwärts.

    Visual Basic-Quellcode

    1. Sub Nominationen_loeschen()
    2. '
    3. ' Nominationen_loeschen Makro
    4. '
    5. '
    6. Range("H6").Select
    7. Selection.AutoFilter
    8. Selection.AutoFilter Field:=8, Criteria1:="=*Nom*", Operator:=xlAnd
    9. Range("A7").Select
    10. Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    11. Selection.EntireRow.Delete
    12. Selection.AutoFilter Field:=8
    13. Selection.AutoFilter
    14. End Sub



    Mehr ist es nicht, man darf auf den button nur eben nicht klicken, wenn keine "Nom"'s in der Spalte stehen und das is doof.
    Ich will, dass man da immer wenn man das Dokument öffnet und die Liste eingefügt hat, einmal auf den Button drückt und alles, was nicht benötigt wird, aussortiert wird.
    Hallo,

    was hältst du davon?

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub Loeschen_mit_Suche()
    2. Dim vBlatt As Worksheet
    3. Dim vSuchZeile, vSuchSpalte As Integer
    4. vSuchZeile = 6 'Überschriftzeile für Autofilter
    5. vSuchSpalte = 8 'Überschriftspalte für Autofilter (8 = H)
    6. Application.ScreenUpdating = False
    7. Set vBlatt = ThisWorkbook.Sheets("Tabelle1")
    8. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter Field:=8, Criteria1:="=*Nom*", _
    9. Operator:=xlAnd
    10. vBlatt.Rows(vSuchZeile + 1 & ":" & vBlatt.Rows.Count).Delete Shift:=xlUp
    11. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter
    12. Application.ScreenUpdating = True
    13. Set vBlatt = Nothing
    14. End Sub


    lg Markus
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!:
    Wunderbar, Danke!
    So weit hat der Code genau das gemacht, was ich woltle, perfekt.

    Also hab ich weiter getestet, denn in der Spalte sind mehrere Daten vorhanden, die weg müssen.

    Ich hab das ganze mehrfach untereinander gefügt und die Criterias geändert, wodurch mir die Fehlermedlung:


    Fehler beim Kompilieren:

    Mehrfachdeklaration im Gültigkeitsbereich


    angezeigt wird. Da ist mein Plan wohl fehlgeschlagen :S





    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub Aussortieren()
    2. 'Nom
    3. Dim vBlatt As Worksheet
    4. Dim vSuchZeile, vSuchSpalte As Integer
    5. vSuchZeile = 6 'Überschriftzeile für Autofilter
    6. vSuchSpalte = 8 'Überschriftspalte für Autofilter (8 = H)
    7. Application.ScreenUpdating = False
    8. Set vBlatt = ThisWorkbook.Sheets("Tabelle1")
    9. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter Field:=8, Criteria1:="=*Nom.*", _
    10. Operator:=xlAnd
    11. vBlatt.Rows(vSuchZeile + 1 & ":" & vBlatt.Rows.Count).Delete Shift:=xlUp
    12. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter
    13. Application.ScreenUpdating = True
    14. Set vBlatt = Nothing
    15. 'storno
    16. Dim vBlatt As Worksheet
    17. Dim vSuchZeile, vSuchSpalte As Integer
    18. vSuchZeile = 6 'Überschriftzeile für Autofilter
    19. vSuchSpalte = 8 'Überschriftspalte für Autofilter (8 = H)
    20. Application.ScreenUpdating = False
    21. Set vBlatt = ThisWorkbook.Sheets("Tabelle1")
    22. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter Field:=8, Criteria1:="=*storn*", _
    23. Operator:=xlAnd
    24. vBlatt.Rows(vSuchZeile + 1 & ":" & vBlatt.Rows.Count).Delete Shift:=xlUp
    25. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter
    26. Application.ScreenUpdating = True
    27. Set vBlatt = Nothing
    28. 'Wochenschnitt
    29. Dim vBlatt As Worksheet
    30. Dim vSuchZeile, vSuchSpalte As Integer
    31. vSuchZeile = 6 'Überschriftzeile für Autofilter
    32. vSuchSpalte = 8 'Überschriftspalte für Autofilter (8 = H)
    33. Application.ScreenUpdating = False
    34. Set vBlatt = ThisWorkbook.Sheets("Tabelle1")
    35. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter Field:=8, Criteria1:="=*wochenschn*", _
    36. Operator:=xlAnd
    37. vBlatt.Rows(vSuchZeile + 1 & ":" & vBlatt.Rows.Count).Delete Shift:=xlUp
    38. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter
    39. Application.ScreenUpdating = True
    40. Set vBlatt = Nothing
    41. End Sub
    Hallo,

    also wenn du mehr als 2 Kriterien hast (wie in deinem Fall), könnte man entweder den Spezialfilter verwenden oder man lässt den Autofilter durch eine Schleife laufen. Das mehrfache kopieren des selben Codes ist daher unsinnig.

    Dein Fehler kommt daher, weil du die Variablen mehrfach deklarieren willst. "Dim ..."

    Hier ein Beispiel:


    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub Loeschen_mit_Suche()
    2. Dim t As Byte
    3. Dim vBlatt As Worksheet
    4. Dim vSuchZeile, vSuchSpalte As Integer
    5. Dim vSuchbegriff(2) As String
    6. vSuchbegriff(0) = "*Nom.*"
    7. vSuchbegriff(1) = "*storn*"
    8. vSuchbegriff(2) = "*wochenschn*"
    9. vSuchZeile = 6 'Überschriftzeile für Autofilter
    10. vSuchSpalte = 8 'Überschriftspalte für Autofilter (8 = H)
    11. Application.ScreenUpdating = False
    12. Set vBlatt = ThisWorkbook.Sheets("Tabelle1")
    13. For t = 0 To UBound(vSuchbegriff)
    14. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter Field:=8, Criteria1:="=" & vSuchbegriff(t), _
    15. Operator:=xlAnd
    16. vBlatt.Rows(vSuchZeile + 1 & ":" & vBlatt.Rows.Count).Delete Shift:=xlUp
    17. vBlatt.Cells(vSuchZeile, vSuchSpalte).AutoFilter
    18. Next
    19. Application.ScreenUpdating = True
    20. Set vBlatt = Nothing
    21. End Sub



    lg Markus
    :!: Danke an alle, die ihr Wissen freiwillig teilen und stets so kompetent & höflich sind :!: