Registriert seit: 28.05.2017
Version(en): 365
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ß
Registriert seit: 12.03.2016
Version(en): Excel 2003/ 2016
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
Registriert seit: 11.04.2014
Version(en): '97 bis 2016; 365
07.12.2018, 04:28
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2018, 04:28 von Käpt'n Blaubär.)
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 Dumüßtest Dir Gedanken darum machen, wie Du es startest. Der oben gezeigte Codeerledigt 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.
Registriert seit: 11.04.2014
Version(en): '97 bis 2016; 365
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 darfvon 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 danndie große Auswahl.
Registriert seit: 11.04.2014
Version(en): '97 bis 2016; 365
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.
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
@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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
07.12.2018, 09:27
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2018, 09:28 von RPP63.)
Soderle! Die Datei mit dem ältesten Erstelldatum (NICHT letztem Speicherdatum) lösche ich in meinem Test so: Modul Modul1Option 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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 12.10.2014
Version(en): 365 Insider (64 Bit)
Ach so: snb würde daraus einen smarten Einzeiler machen.  Nachteil: Den versteht kaum einer … :21:
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 28.05.2017
Version(en): 365
07.12.2018, 10:31
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2018, 10:31 von EasY.)
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.
00202
Nicht registrierter Gast
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
|