Clever-Excel-Forum

Normale Version: VBA - Mappe speichern + Backup
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3 4
Hi Leute,

es geht um VBA. Ich möchte auf Knopfdruck die Mappe abspeichern und ein Backup in einem bestimmten Ordner erstellen. Soweit nicht so schwer ... die Krux liegt nun darin, dass nur maximal "x" Backup-Dateien vorhanden sein sollen - der soll also dann die letzte Datei löschen. Anbei mein Code bisher


Code:
Sub Speichern()
'Code in DieseArbeitsmappe
   With ThisWorkbook
       Call .Save
       Call .SaveCopyAs(Filename:="C:\Users\Desktop\Name\" & Range("H1") & " - " & Format(Now, "yyyymmdd_hhmm") & ".xlsm")
   End With
End Sub



Ist das möglich, wie ich mir das vorstelle?


Gruß
Hallo

Zitat: Call .Save

da steht Call Save!  Ist das korrekt??  Das kannst nur du wissen, denn Call ruft als Befehl normalerweise ein existierendes Unterprogram, ein anderes Makro auf.  Das klappt aber nicht mit vorgestelltem Punkt!!  Dann bezieht sich der Code auf die With Klammer!!  Beides geht meines Wissens nicht!!

Ich nehme an dein Code klappt wenn du beide Call's weglaest.  Anonsten gibt es sicher einen Laufzeitfehler!!
Die Frage wie die letzte Backup Datei zu lsöchen ist bleibt aber offen, darüber habe ich leider kein Fachweissen.

mfg  Gast 123
Hallo,

versuche es mal so:

Zitat:Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)
'Code in DieseArbeitsmappe
    ThisWorkbook.Save
    ThisWorkbook.SaveCopyAs(Filename:="C:\Users\Desktop\Name\" & Range("H1") & _
       
" - " & Format(Now, "yyyymmdd_hhmm") & ".xlsm")
End Sub

Dein Code mit : Sub Speichern() würde in ein Allgemeines Modul gehören und Du
müßtest Dir Gedanken darum machen, wie Du es startest. Der oben gezeigte Code
erledigt das nun automatisch bei jedem Schließen der Datei.

Die With-EndWith-Schleife muß nicht sein; das Call schon gar nicht, denn Du willst ja kein anderes Makro, Funktion oder gar ein Programm aufrufen.
Hallo,

ich habe gerade noch mal Deinen Einstiegspost gelesen und festgestellt, daß ich mit meiner Antwort ziemlich falsch liege.

Zitat:Ich möchte auf Knopfdruck die Mappe abspeichern und ein Backup in einem bestimmten Ordner erstellen.

... dann gehört der Code nicht mehr in DieseArbeitsmappe  sondern in ein Allgemeines Modul
und er heißt auch nicht mehr Private Sub Workbook_BeforeClose(Cancel As Boolean) sondern er darf
von nun an getrost wieder Sub Speichern()heißen. Den Code kannst Du so wie oben beschrieben,
übernehmen.
Wie man einen "Knopf" also einen Button anlegt, weißt Du? Wenn nicht, nachfragen. Da gibt es dann
die große Auswahl.
Hallo,

Zitat:dass nur maximal "x" Backup-Dateien vorhanden sein sollen - der soll also dann die letzte Datei löschen. Anbei mein Code bisher

... wirklich die letzte?
ich habe jetzt Deine SaveAs Codezeile nicht mehr vor meinem geistigen Auge, es ist ja auch schon recht früh,
weiß aber noch, da war auch irgendein Datum drin. also Vorsicht mit die Letzte. Die Letzte könnte die Erste sein :05:
Aber da das sicher noch ein Weilchen dauert, bevor wir uns darüber Gedanken machen, muß das nicht noch heute
Nacht unter die Lupe genommen werden.
@Gast123, @Peter:

Selbstverständlich kann man Call auch zum Aufruf einer Methode benutzen!
Wichtig ist dabei allerdings, dass evtl. Übergabeparameter in Klammern übergeben werden müssen.
Dies hat der TE korrekt gemacht!

Es gehen beide Befehle:
Code:
.SaveCopyAs Filename:="C:\Users\Desktop\Name\" & Range("H1") & " - " & Format(Now, "yyyymmdd_hhmm") & ".xlsm"
Call .SaveCopyAs(Filename:="C:\Users\Desktop\Name\" & Range("H1") & " - " & Format(Now, "yyyymmdd_hhmm") & ".xlsm")

Zum Löschen der Alt-Datei(en) müsste etwas mit dem FileSystemObject gehen.

Gruß Ralf
Soderle!
Die Datei mit dem ältesten Erstelldatum (NICHT letztem Speicherdatum) lösche ich in meinem Test so:

Modul Modul1
Option Explicit 
 
Sub Delete_oldest_File() 
Dim FSO, f, fi 
Dim MinDateCreated As Date: MinDateCreated = 99999 
 
Set FSO = CreateObject("Scripting.FileSystemObject") 
Set f = FSO.GetFolder(Environ("UserProfile") & "\Desktop\Test") 
For Each fi In f.Files 
  If fi.DateCreated < MinDateCreated Then MinDateCreated = fi.DateCreated 
Next 
For Each fi In f.Files 
  If fi.DateCreated = MinDateCreated Then FSO.DeleteFile fi 
Next 
End Sub 

Gruß Ralf
Ach so:
snb würde daraus einen smarten Einzeiler machen. Wink
Nachteil: Den versteht kaum einer …  :21:
WOW ....

nett, dass ihr mir helft.

Der Code war bereits in der Datei, die ich zur "Anpassung" bekommen habe. Dass mit dem .call kannte ich tatsächlich auch nicht - es funktionierte jedoch, sodass ich das erstmal so belassen habe. Ich bin allerdings auch kein Profi was VBA angeht. Ich kann Code ein wenig lesen und habe mir mehrere Videoreihen dazu angeschaut bzw im Internet gestöbert. Da ich Excel mittlerweile als mein Hobby ansehe, bin ich auch nicht abgeneigt mehr zu lernen :)

Erstes Fazit:
Wenn der Speichercode verkürzt oder verbessert werden kann, bin ich auf jeden Fall d'accord. Einen Button in der Datei gibt es tatsächlich schon und das Verknüpfen etc. ist bekannt, danke Käptn.

Zweites Fazit:
@RPP63
Meine Datei erstellt beim Speichern automatisch eine Backup-Datei, die auch die aktuelle Minute im Namen beinhaltet. Nur, wenn ich innerhalb einer Minute mehrfach eine Speicherung durchführe, würde die alte Datei überschrieben werden. Wenn ich keinen Denkfehler habe, ist doch das älteste Erstelldatum dann auch gleichzeitig das älteste Speicherdatum ... oder? Von daher würde es doch super passen!

Was noch fehlen würde wäre eine Abfrage, wieviele Dateien in dem Ordner vorhanden sind.

Gruß

P.S.: Ich bin gespannt, ob SNB sich meldet :21:
P.S.S.: Ich stelle gerade beim "Lesen" deines Codes fest, dass ich den wohl doch nicht lesen kann ^^
P.S.S.S.: Ich hoffe, dass sich hier nicht ein Sprachgebrauchsfehler eingeschlichen hat. Es tatsächlich das älteste und nicht das jüngste Backup gelöscht werden. "Letzte" ist wohl sehr ungenau.
Hallo, :19:

Einzeiler (zumindest in dem Fall) sind in der Regel - DOS/SHELL/WMIC  - bzw. ähnlichem belastet. Das geht auf manchem Firmenrechner nicht. :21:

Wenn man es einsetzen kann/darf ist es sehr bequem.

Älter Dateien lösche ich z. B. so (mit Erklärung): :21:


Code:
Option Explicit
Public Sub Main()
    Shell ("Forfiles /P C:\Temp\H2SO4\  /S /M *.* /D -8 /C ""cmd /c del /q @path""")
End Sub
' /P --> Gib den Pfad an
' /S --> Mit Unterordnern
' /M --> Nimm eine Suchmaske - hier *.* - es geht natürlich auch *.xlsm
' /D --> lösche alle Dateien die x Tage älter als heute sind, + geht auch
' /C --> Mache das für folgenden Befehl, in dem Fall ""cmd /c del /q @path""

' Für CMD
' /C --> führt den Befehl aus und endet dann

' Für DEL
' /Q --> Keine Rückfrage bei Verwendung globaler Platzhalter

' @Path --> Führe das im angegebenen Pfad aus

Man kann sich die Hilfe zu DOS-Befehlen auch schnell so ausgeben lassen: :21:


Code:
Option Explicit
Public Sub GibAus()
    On Error GoTo Fin
    ShellAndWait "cmd /c Forfiles /? > " & Environ("TEMP") & "\forefiles.txt"
    Shell "Notepad " & Environ("TEMP") & "\forefiles.txt", vbMaximizedFocus
Fin:
    If Err.Number <> 0 Then MsgBox "Error: " & _
        Err.Number & " " & Err.Description
End Sub
Private Sub ShellAndWait(ByVal strPathName As String)
   Dim WshShell As Object
   On Error GoTo Fin
   Set WshShell = CreateObject("WScript.Shell")
   WshShell.Run strPathName, 0, True
Fin:
   Set WshShell = Nothing
   If Err.Number <> 0 Then MsgBox "Error: " & _
       Err.Number & " " & Err.Description
End Sub
Seiten: 1 2 3 4