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
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, 03:28
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2018, 03: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 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.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!
Grüße aus Norderstedt, Peter
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 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.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!
Grüße aus Norderstedt, Peter
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.
________________________________________________________________________
wer aufgibt, ohne es versucht zu haben, gibt einfach nur auf!
Grüße aus Norderstedt, Peter
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 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 (32 Bit)
07.12.2018, 08:27
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2018, 08: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 (32 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, 09:31
(Dieser Beitrag wurde zuletzt bearbeitet: 07.12.2018, 09: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.
Registriert seit: 30.08.2014
Version(en): Office 365 - Beta 32 Bit
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
________
Servus
Case
|