Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1924to1928
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Backupdatei anlegen - nur 30 Files

Backupdatei anlegen - nur 30 Files
11.04.2023 21:01:58
Josch

Hallo,

ich habe einen Code, der mir eigentlich meine Backups in einem Ordner ablegt. Da der Ordner mit der Zeit zu voll wurde, habe ich die Anzahl der Files auf 30 begrenzen wollen. Jetzt habe ich aber gemerkt, dass er mir nicht das älteste Backupfile löscht, sondern irgendwie immer die letzte Datei zuvor. Kann mir jemand den Code berichtigen, wäre sehr dankbar.

Josch

Public Sub Backupdatei_anlegen()
   Dim SavePath As String
   Dim FileName As String
   Dim FileExtension As String
   Dim FileDate As String
   Dim FileBackupName As String
   Dim FileUsername As String
   
   Dim Datei As String
   Dim DatAlt As String
   Dim DateiLösch As String
   Dim x As Long
   Dim Zähler As Long
   Dim MMax As Integer
   

Application.DisplayAlerts = False
Application.EnableEvents = False
   
     SavePath = ThisWorkbook.Path & "\Backup\"
     
        If Dir(SavePath, vbDirectory) > "" Then
        Else
        MkDir ThisWorkbook.Path & "\Backup"
        End If
     
     FileName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
     FileExtension = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") + 1)
     FileUsername = Environ("UserName")
     FileDate = Format(Now, "YYYY-MM-DD hh'mm'ss") & " Uhr"
     MMax = 30
     
     '--- letztes Backup löschen
     x = Len(FileName & "_" & FileUsername & "_") + 1
     DatAlt = "ZZZ"
     Datei = Dir(SavePath & FileName & "_*." & FileExtension)
     Do While Datei > ""
        Zähler = Zähler + 1
        If Mid(Datei, x)  DatAlt Then
            DatAlt = Mid(Datei, x)
            DateiLösch = Datei
        End If
        Datei = Dir
     Loop
     If Zähler > MMax Then Kill SavePath & DateiLösch
     
     FileBackupName = SavePath & FileName & "_" & FileDate & "." & FileExtension
     ActiveWorkbook.SaveCopyAs FileBackupName

    
Application.DisplayAlerts = True
Application.EnableEvents = True

End Sub


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

Betreff
Datum
Anwender
Anzeige
AW: Backupdatei anlegen - nur 30 Files
11.04.2023 21:38:04
Phio
Das Problem ist wohl der Dateiname. Der Code schreibt den Dateinamen nun um. Lässt die . und : weg. Erst dann wird verglichen.

Hier der geänderte Code:

Public Sub Backupdatei_anlegen()
   Dim SavePath As String
   Dim FileName As String
   Dim FileExtension As String
   Dim FileDate As String
   Dim FileBackupName As String
   Dim FileUsername As String
   
   Dim Datei As String
   Dim DatAlt As String
   Dim DateiLösch As String
   Dim x As Long
   Dim Zähler As Long
   Dim MMax As Integer
   
   Application.DisplayAlerts = False
   Application.EnableEvents = False
   
   SavePath = ThisWorkbook.Path & "\Backup\"
   
   If Dir(SavePath, vbDirectory) > "" Then
   Else
      MkDir ThisWorkbook.Path & "\Backup"
   End If
   
   FileName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
   FileExtension = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") + 1)
   FileUsername = Environ("UserName")
   FileDate = Format(Now, "YYYY-MM-DD hh'mm'ss")
   MMax = 30
   
   x = Len(FileName & "_" & FileUsername & "_") + 1
   DatAlt = "99999999999999"
   Datei = Dir(SavePath & FileName & "_*." & FileExtension)
   Do While Datei > ""
      Zähler = Zähler + 1
      Dim DatumImNamen As String
      DatumImNamen = Mid(Datei, x + Len(FileUsername) + 2, 14)
      If DatumImNamen  DatAlt Then
         DatAlt = DatumImNamen
         DateiLösch = Datei
      End If
      Datei = Dir
   Loop
   If Zähler > MMax Then Kill SavePath & DateiLösch
   
   FileBackupName = SavePath & FileName & "_" & FileUsername & "_" & Format(DateValue(Left(FileDate, 10)), "JJJJMMTT") & Replace(Right(FileDate, 8), ":", "") & "." & FileExtension
   ActiveWorkbook.SaveCopyAs FileBackupName
   
   Application.DisplayAlerts = True
   Application.EnableEvents = True
End Sub


Anzeige
AW: Backupdatei anlegen - nur 30 Files
12.04.2023 18:13:02
Luschi
Hallo Phio,

habe Deinen Vba-Code getestet und dazu 4 Anmerkungen:
- in dieser Vba.Zeile: FileBackupName = SavePath & FileName & "_" & FileUsername &
     "_" &  Format(DateValue(Left(FileDate, 10)), "JJJJMMTT") &
    Replace(Right(FileDate, 8), ":", "") & "." & FileExtension
  muß "JJJJMMTT" ausgetauscht werden gegen "yyyymmdd"

- die Dir()-Funktion mit Mustersuche garantiert nicht, daß die Datei mit dem kleinsten
  Backup Datum/Zeit als erste Datei gefunden wird.
  Dadurch kann es passieren, daß die falsche Datei beim Erreichen des Maximums
  gelöscht wird.

- If Zähler > MMax Then Kill SavePath & DateiLösch
  legt 31 BackUp-Dateien an

- ich verwende keine Umlautbuchstaben in Variablen-/Prozedur-/Funktionsnamen
  also 'DateiLoesch' statt 'DateiLösch'

Gruß von Luschi
aus klein-Paris


Anzeige
AW: Backupdatei anlegen - nur 30 Files
12.04.2023 18:44:40
Phio
Hallo,
danke für deine Hinweise. Ich habe mal etwas umgeschrieben:

Public Sub Backupdatei_anlegen()
   Dim SavePath As String
   Dim FileName As String
   Dim FileExtension As String
   Dim FileDate As String
   Dim FileBackupName As String
   Dim FileUsername As String
   
   Dim Datei As String
   Dim BackupFiles As Collection
   Dim BackupFile As Variant
   Dim x As Long
   Dim Zaehler As Long
   Dim MMax As Integer
   
   Application.DisplayAlerts = False
   Application.EnableEvents = False
   
   SavePath = ThisWorkbook.Path & "\Backup\"
   
   If Dir(SavePath, vbDirectory) > "" Then
   Else
      MkDir ThisWorkbook.Path & "\Backup"
   End If
   
   FileName = Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") - 1)
   FileExtension = Mid(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".") + 1)
   FileUsername = Environ("UserName")
   FileDate = Format(Now, "YYYY-MM-DD hh'mm'ss")
   MMax = 30
   
   x = Len(FileName & "_" & FileUsername & "_") + 1
   Set BackupFiles = New Collection
   Datei = Dir(SavePath & FileName & "_*." & FileExtension)
   Do While Datei > ""
      Zaehler = Zaehler + 1
      BackupFiles.Add Array(Mid(Datei, x + Len(FileUsername) + 2, 14), Datei)
      Datei = Dir
   Loop
   
    'Sortiere die BackupFiles-Sammlung nach Datum
   Dim i As Long, j As Long
   Dim Temp As Variant
   For i = 1 To BackupFiles.Count - 1
      For j = i + 1 To BackupFiles.Count
         If BackupFiles(i)(0) > BackupFiles(j)(0) Then
            Set Temp = BackupFiles(i)
            BackupFiles.Remove i
            BackupFiles.Add Temp, , j
         End If
      Next j
   Next i
   
   If Zaehler >= MMax Then
      ' Loeschen der aeltesten Datei
      Kill SavePath & BackupFiles(1)(1)
   End If
   
   FileBackupName = SavePath & FileName & "_" & FileUsername & "_" & Format(DateValue(Left(FileDate, 10)), "yyyymmdd") & Replace(Right(FileDate, 8), ":", "") & "." & FileExtension
   ActiveWorkbook.SaveCopyAs FileBackupName
   
   Application.DisplayAlerts = True
   Application.EnableEvents = True
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige