Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1844to1848
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

VBA "versteckte Backups"

VBA "versteckte Backups"
11.09.2021 20:22:21
Excel
Hallo zusammen,
ich möchte niemanden langweilen und komme deswegen direkt zur Sache:
Ich habe ein Excel-Zeiterfassungstool erstellt, in welchem bereits mehrere, funktionierende Makros laufen. Leider habe ich 2 Probleme:
1) Ich möchte einen VBA Code schreiben, welcher a) in dem Verzeichnis, in welchem die Excel Datei aktuell gespeichert ist einmalig einen versteckten Ordner anlegt, sofern dieser nicht schon existiert, welcher "[Backup | Zeiterfassungstools]" heißt und b) bei jedem Öffnen der Excel Datei (des Zeiterfassungstools) eine ebenfalls versteckte Backupdatei mit dem Namen "[Backup] + Name der zu sichernden Backupdatei" im Backup Ordner anlegt, welche bei jedem weiteren Öffnen der Excel Datei (des Zeiterfassungstools) überschrieben werden soll.

Folgenden Code habe ich bereits geschrieben, welcher eine Backupdatei (versteckt) anlegt...

Sub BackUp()
'Erstellt ein Backup der aktuell geöffneten Excel-Datei auf demselben Pfad
ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & _
"\" & "[Backup]" & " " & _
ThisWorkbook.Name
'Versteckt die Backup-Datei
SetAttr ThisWorkbook.Path & _
"\" & "[Backup]" & " " & _
ThisWorkbook.Name, vbHidden
End Sub
...leider kommt es beim zweiten Öffnen und damit Anlegen der versteckten Backupdatei zu einem Laufzeitfehler. Kommentiere ich das "verstecken" im Code aus, funktioniert alles und die Backup-Datei wird ganz normal überschrieben.
Ich vermute das liegt daran, dass beim zweiten Öffnen des Zeiterfassungstools laut Code zuerst die Backup-Datei mit gleichem angelegt und dann erst im zweiten Schritt versteckt wird, was zu einem Konflikt wegen gleichem Namen führt und die Datei nicht mehr überschrieben werden kann, da sie bereits angelegt wurde und sich nur deren Eigenschaft (zu "versteckt") ändert. Kann aber auch an etwas anderem liegen.
Einen Ordner konnte ich auch per Code anlegen allerdings nicht versteckt, nicht einmalig (also ohne Prüfung ob ein solcher Ordner schon existiert) und die Backup-Datei wird nicht in diesem Ordner sondern leider eine Dateiebene höher erstellt/abgelegt:

Option Explicit
Sub Folder()
Dim strPfad As String
strPfad = ThisWorkbook.Path
If strPfad > "" Then
If Dir(strPfad & "\[Backups]", vbDirectory) = "" Then MkDir strPfad & "\[Backups]"
Else
MsgBox "Datei ist noch nicht gespeichert."
End If
End Sub
2) Die von mir erstellte Excel-Datei benötigt >1min zum Öffnen selbst auf meinem relativ modernen Surface Laptop 3. (Ohne meinen VBA Code lässt sich die Excel in Performance beim Öffnen deutlich verbessern (Ziel: ca.30-40s). Daher hier der gesamte Code:
Diese Arbeitsmappe

Private Sub Workbook_Open()
'Öffne das Tabellenblatt des aktuellen Monats
Monat = Format(Date, "MMMM")
Worksheets(Monat).Activate
'Einen Ordner für die Backup Dateien erstellen
'Application.OnTime Now(), "Folder"
'Pro Öffnen eine versteckte Backupdatei im selben Pfad erstellen welche bei jedem nachfolgenden Öffnen überschrieben wird
Application.OnTime Now(), "BackUp"
'Sperre den letzten Monat 5 Tage nach Ablauf
Dim i As Integer
Dim dTag As Integer
For i = 1 To 12
If Weekday(DateSerial(Year(Date), i + 1, 1), 2) = 1 Then
dTag = 5
ElseIf Weekday(DateSerial(Year(Date), i + 1, 1), 2)  DateSerial(Year(Date), i + 1, dTag) Then
'Hier dein Passwort anpassen
Sheets(i).Protect Password:="Test"
End If
Next
End Sub
Private Sub Workbook_NewSheet(ByVal Sh As Object)
'Verhindere, dass neues leeres Tabellenblatt eingefügt werden kann
With Application
.ScreenUpdating = False
.DisplayAlerts = False
Sh.Delete
.DisplayAlerts = True
.ScreenUpdating = True
End With
End Sub
Modul 1

Private Sub Workbook_Open()
'Öffne das Tabellenblatt des aktuellen Monats
Monat = Format(Date, "MMMM")
Worksheets(Monat).Activate
'Sperre den letzten Monat 5 Tage nach Ablauf
Dim i As Integer
Dim dTag As Integer
For i = 1 To 12
If Weekday(DateSerial(Year(Date), i + 1, 1), 2) = 1 Then
dTag = 5
ElseIf Weekday(DateSerial(Year(Date), i + 1, 1), 2)  DateSerial(Year(Date), i + 1, dTag) Then
'Hier dein Passwort anpassen
Sheets(i).Protect Password:="Test"
End If
Next
End Sub
Modul 2

Sub BackUp()
'Erstellt ein Backup der aktuell geöffneten Excel-Datei auf demselben Pfad
ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & _
"\" & "[Backup]" & " " & _
ThisWorkbook.Name
'Versteckt die Backup-Datei
'SetAttr ThisWorkbook.Path & _
'"\" & "[Backup]" & " " & _
'ThisWorkbook.Name, vbHidden
End Sub
Modul 3

Option Explicit
Sub Folder()
Dim strPfad As String
strPfad = ThisWorkbook.Path
If strPfad > "" Then
If Dir(strPfad & "\[Backups]", vbDirectory) = "" Then MkDir strPfad & "\[Backups]"
Else
MsgBox "Datei ist noch nicht gespeichert."
End If
End Sub
Hat hier jemand Vorschläge, wie ich meinen Code effizienter gestalten kann bzw. wie ich sonst für ein schnelleres Öffnen sorgen kann?
Vielen Dank für eure Unterstützung und die Geduld beim lesen!
Gruß
Excel Friend

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA "versteckte Backups"
12.09.2021 02:37:53
Steve
Hi,
was mir auf anhieb auffällt dass der Anfang von "Diese Arbeitsmappe" und "Modul 1" identisch ist. Wozu?
Gruß Steve
AW: VBA "versteckte Backups"
12.09.2021 10:35:34
ralf_b
du könntest die versteckte Datei vor dem neuen Speichern proforma Löschen. Wird ja eh sonst überschrieben.
Du erstellst einen Backupordner [Backups] aber die Datei erhält nur den Namenspräfix [backup] und ein Leerzeichen.
Ich sehe da eher wenig Potiential die Datei schneller zu öffnen. Wenn das wirklich der ganze Code ist, dann mußt du wo anders suchen. z.b. Berechnungsoption, evtl Addons, die auch beim Öffnen geladen werden. Oder Datenabfragen, die aktualisiert werden.
Anzeige

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige