Tabellenblätter nach Ablaufdatum löschen

  • Excel

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Ralle.

    Tabellenblätter nach Ablaufdatum löschen

    Hallo zusammen,

    in einem Excel Dokument werden per Buttom neue Datenblätter erstellt, welche als Blattname das jeweils nächste Datum erhalten. Nach einer einstellbaren Zeit sollen die Blätter welche älter als ein vorgegebener Wert sind gelöscht weden. Mein Code löscht auch alle Tabellenblätter welche älter sind als der eingestellte Wert. Es gibt aber auch Tabellenblätter mit dem Datum von heute und für die nächsten 7 Tage, diese werden auch mit gelöscht. Kann mir jemand bei dem Problem helfen?
    Hier die Zeilen aus meinem derzeitigen Code:

    Visual Basic-Quellcode

    1. Rem AlteTabellenLoeschen
    2. Application.DisplayAlerts = False
    3. Dim Tabelle As Worksheet
    4. For Each Tabelle In Worksheets
    5. If Tabelle.Name < Date - Worksheets("Daten").Range("O44") Then Tabelle.Delete
    6. End If
    7. Next
    8. Application.DisplayAlerts = True
    9. End Sub



    Vielen Dank!

    *Code-BBCode eingefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Welches Datumsformat haben denn die Tabellennamen? Wenn dies nicht YYYY-MM-DD ist (das Zeichen jeweils dazwischen ist aber natürlich egal), kann es meiner Meinung nach nicht funktionieren.

    EDIT: Vergiss das, du rechnest ja mit einem echten Datumswert, ich ging erst von einem String-Vergleich aus, da gilt das jetzt durchgestrichene. Ich hätte zur besseren Lesbarkeit CDate(Tabelle.Name) geschrieben. Was steht denn in Worksheets("Daten").Range("O44")? Die Anzahl Tage?

    btw: Rem habe ich das letzte Mal unter DOS gesehen (QBasic) ... ;)
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Ich hab's in VB6 getestet und es muss ganz sicher mit CDate gearbeitet werden. Um Fehler jeglicher Art zu verhindern, würde ich es wie folgt schreiben:

    Visual Basic-Quellcode

    1. If CDate(Tabelle.Name) < (Date - CInt(Worksheets("Daten").Range("O44")) Then
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum
    Wenn man von dem Syntaxfehler in Post#1, Zeile#11 absieht, funktioniert der Code bei mir - obwohl es mir als VB.NET-Option-Strict-On-Fanatiker kalt den Rücken runter läuft, wenn hier Strings mit Datumsangaben verglichen werden.
    Habe in "Tabelle1", Zelle A1 eine 7 drinstehen, Tabellen mit folgenden Namen: Tabelle1, 11.11.2022, 20.05.2024, 31.05.2024 und den abgewandelten Code aus Post#1

    Visual Basic-Quellcode

    1. Sub Makro1()
    2. Application.DisplayAlerts = False
    3. Dim Tabelle As Worksheet
    4. For Each Tabelle In Worksheets
    5. If Tabelle.Name < Date - Worksheets("Tabelle1").Range("A1") Then Tabelle.Delete
    6. Next
    7. Application.DisplayAlerts = True
    8. End Sub

    Wenn ich das Makro ausführe, werden die Tabellen 11.11.2022 und 20.05.2024 gelöscht, der Rest bleibt. Passt also.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Das Löschen der "alten Tage" klappt auch bei mir. Der Fehler liegt beim aktuelle Tag bzw. bei den zukünftigen Tagen. Wenn ich zum Beispiel folgende Tabellenblätter erzeugt habe: 20.05.2024, 21.05.2024, 22.05.2024,23.05.2024, 24.05.2024, 25.05.2024, 26.05.2024, 27.05.2024, 28.05.2024, 29.05.2024, 30.05.2024, 31.05.2024, 01.06.2024, 02.06.2024, 03.06.2024 und dann alle Einträge älter 10 Tage gelöscht werden sollen, so werden korrekt die Tabellenblätter 20.05.2024, 21.05.2024 und 22.05.2024 gelöscht. Die Tage 23.05.2024 bis 31.05.2024 bleiben erhalten. Falsch ist, dass auch das heutige Tabellenblatt vom 01.06.2024 sowie der 02.06.2024 und der 03.06.2024 gelöscht werden.

    die Farbe Rot ist der Moderation vorbehalten und wurde ersetzt ~VaporiZed

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    Dann versuchen wir es etwas typisierter:

    Visual Basic-Quellcode

    1. Application.DisplayAlerts = False
    2. Dim Tabelle As Worksheet
    3. For i = Worksheets.Count To 2 Step -1 'beim Löschen: rückwärts durch die Schleife
    4. Dim DayCount As Integer
    5. DayCount = Worksheets("Tabelle1").Range("A1")
    6. Dim MinimumDate As Date
    7. MinimumDate = DateAdd("d", -DayCount, Date)
    8. Dim DateDifference As Integer
    9. DateDifference = CDate(Worksheets(i).Name) - MinimumDate 'Fehler noch abfangen, wenn hier Nicht-Datums-Tabellen-Namen auftauchen
    10. If DateDifference < 0 Then Worksheets(i).Delete
    11. Next
    12. Application.DisplayAlerts = True

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für den Code. Dieser löscht die Tabellenblätter wie gewünscht, bleibt dann aber in Zeile 11 mit Laufzeitfehler "13" stehen. Ich befasse mich leider erst seit wenigen Wochen mit VBA und bin mit dem Code noch überfordert. Offensichtlich startet die Schleife am letzten Tabellenblatt und arbeitet korrekt rückwärts ab bis es auf ein Arbeitsblatt trifft dessen Name kein Datum ist. Was muss ich hier noch anpassen damit der Code die ersten 3 betroffenen Tabellenblätter sauber abarbeitet?
    Dann ist Dein nächster Punkt: Wie recherchiert man entsprechend selbständig. Meine Internet-Suchbegriffe (weil ich mit VBA effektiv nix am Hut habe): VBA Test if string is date. Da kommen wir zur VBA-Funktion IsDate (na potzblitz!)

    Visual Basic-Quellcode

    1. Sub Makro1()
    2. Application.DisplayAlerts = False
    3. For i = Worksheets.Count To 1 Step -1 'beim Löschen: rückwärts durch die Schleife
    4. Dim DayCount As Integer
    5. DayCount = Worksheets("Tabelle1").Range("A1")
    6. Dim MinimumDate As Date
    7. MinimumDate = DateAdd("d", -DayCount, Date)
    8. Dim DateDifference As Integer
    9. If IsDate(Worksheets(i).Name) Then
    10. DateDifference = CDate(Worksheets(i).Name) - MinimumDate
    11. If DateDifference < 0 Then Worksheets(i).Delete
    12. End If
    13. Next
    14. Application.DisplayAlerts = True
    15. End Sub

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.