Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA - Mappe speichern + Backup
#1
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ß
Antworten Top
#2
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
Antworten Top
#3
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
Antworten Top
#4
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
Antworten Top
#5
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
Antworten Top
#6
@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)
Antworten Top
#7
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
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)
Antworten Top
#8
Ach so:
snb würde daraus einen smarten Einzeiler machen. Wink
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)
Antworten Top
#9
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.
Antworten Top
#10
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
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste