enkel 3 laatste backups bijhouden, rest wissen

Status
Niet open voor verdere reacties.

andyraes

Gebruiker
Lid geworden
18 aug 2011
Berichten
13
Hallo,


Ik heb een VBA-code die in excel bij het sluiten van het bestand een backup maakt (in map c:\backup.

=> het onderstaande heb ik geplaatst in VBA in ThisWoorBook. Bij het sluiten wordt er dus telkens een backup geplaatst in bovenstaande map met volgende benaming:
(tijd afsluiten_user_bestandsnaam) - vb 20110819092512_user_test

Hieronder vind je de VBA-code terug:

Code:
[I]  Private Sub Workbook_BeforeClose(Cancel As Boolean)
  
ActiveWorkbook.SaveCopyAs "C:\backup\" & _
                          Format(Now, "yyyymmddhhmmss") & "_" & _
                          Application.UserName & "_" & _
                          ActiveWorkbook.Name
  
End Sub  [/I]

Aangezien dit over een bestand van +/- 10Mb gaat zou ik graag de oudste backups wissen, anders zal deze map enorm groot zijn want dit bestand wordt door verschillende users gebruikt.
Om enkel maar 1 backup bij te houden is dit geen probleem (je overschrijft het bestand) maar ik zou graag 3 bestanden bij houden.

=> Dus de map heeft 3 bestanden. Bij het sluiten van het programma moet de oudste backup (dus alfabetisch gezien het eerste bestand) gewist worden en wordt er een nieuwe backup met usernaam en datum op geslaan.

Kan er mij iemand helpen met de VBA-code hiervoor aub? Ik heb er totaal geen idee van hoe je dit kan programmeren...

Is dit wel mogelijk om te programmeren (omdat dit buiten excel gebeurd, dit is eigenlijk een opdracht die je manueel in Windows uit voert)


Alvast bedankt voor de hulp!
 
Laatst bewerkt door een moderator:
Ik zou het zo doen: met het DIR commando zet je alle bestanden in een matrixvariabele. Bijvoorbeeld door eerst een string te maken met | als scheidingsteken, en met Split de matrix te maken, of met REDIM PRESERVE de matrix bij elk bestand te vergroten en te vullen. Deze lijst kun je sorteren, zodat de oudste bestanden bovenin staan, of onderin, maakt denk ik niet eens zoveel uit. Vervolgens maak je een lus; FOR i=LBound(tmp) TO UBound(tmp). Alle bestanden die dan aan je criterium voldoen kun je dan in de lus met KILL verwijderen.
 
Bedankt voor het antwoord. Ik ben echter een leek in VBA en vrees dus dat ik met uw antwoord niet veel verder zal geraken. Kan je iets meer info geven aub/code verder uit schrijven aub?
 
Ik zal even een macrootje in elkaar bakken.
 
Hier ben ik nog eens,


Ik denk echter niet dat het zo moeilijk hoeft te zijn.
Deze macro wordt telkens uitgevoerd wanneer er eerst een nieuw bestand wordt opgeslagen.

Er moet dus telkens 1 bestand gewist worden en dit is het oudste.
Is het niet mogelijk om via alfabetische volgorde het (alfabetische) eerste bestand op te zoeken?
Wanneer ik die naam in een variabele heb, dan kan ik dit bestand dan wissen.
Dit met de kill-functie (heb dit reeds gevonden op het forum).


Hopelijk kan het met de bovenstaande informatie iets gemakkelijker verlopen
 
En dat is inderdaad precies wat er moet gebeuren. Alleen: hoe weet je dat een bestand het oudste bestand is? Daarvoor moet je dat bestand vergelijken met de andere bestanden. Ergo: je moet alle bestanden die je hebt doorlopen om te zien welke daarvan de oudste is. De manier waarop jij werkt (de kolom met de hand sorteren op datum, en dan visueel constateren dat de bovenste per definitie de oudste is) werkt natuurlijk niet voor een computer; die heeft de visuele controle namelijk niet. Dus moet je, ongeacht het aantal bestanden, alles inlezen, en met elkaar vergelijken. Gaat overigens razendsnel, want dat is dan weer het voordeel van een computer :) Daarbij maakt het nauwelijks uit of er 3, of 30 bestanden worden ingelezen.

Het zal best beter en sneller kunnen, maar ik ben ook maar een redelijk beginnende prutser:

Code:
Const sPad = "C:\Backup\"

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    
    ' Beginnen met het eerste Excel bestand opzoeken in de standaardmap
    MijnBestand = Dir(sPad & "*.xls")
    
    ReDim tmp(0)
    i = 0
    'vervolgens alle bestanden in een matrix variabele zetten.
    Do While MijnBestand <> ""
        ReDim Preserve tmp(i)
        tmp(i) = MijnBestand
        i = i + 1
        MijnBestand = Dir
    Loop

    ' Dan de matrix sorteren ...
    Call SelectionSort(tmp)
    
    ' ... en de oudste 3 bestanden verwijderen
    For i = 0 To UBound(tmp) - 3
''        On Error Resume Next
        Kill sPad & tmp(i)
    Next i

    ' En dan natuurlijk een nieuwe backup maken!
    ActiveWorkbook.SaveCopyAs sPad & Format(Now, "yyyymmddhhmmss") & "_" & Application.UserName & "_" & ActiveWorkbook.Name

End Sub

En de sorteerfunctie:

Code:
Function SelectionSort(TempArray As Variant)
Dim MaxVal As Variant, MaxIndex As Long
Dim i As Integer, j As Integer

    ' Step through the elements in the array starting with the last element in the array.
    For i = UBound(TempArray, 1) To 1 Step -1
        ' Set MaxVal to the element in the array and save the index of this element as MaxIndex.
        MaxVal = TempArray(i)
        MaxIndex = i
        ' Loop through the remaining elements to see if any is larger than MaxVal.
        ' If it is then set this element to be the new MaxVal.
        For j = 1 To i
            If TempArray(j) > MaxVal Then
                MaxVal = TempArray(j)
                MaxIndex = j
            End If
        Next j
        ' If the index of the largest element is not i, then exchange this element with element i.
        If MaxIndex < i Then
            TempArray(MaxIndex) = TempArray(i)
            TempArray(i) = MaxVal
        End If
    Next i

End Function
 
Bedankt voor de moeite,


Ik ben een paar dagen nog-actief geweest dus vandaar dat ik pas vandaag antwoord.
Op het eerste moment werkt het nog niet maar dit heeft enkel met de sub's,... te maken die ik in de macro moet verwerken.

Aangeziend de bestanden genaamd zijn volgens jaar/maand/dag/uur/min/sec weet ik altijd welk bestand het oudste is.

Ik zal nog wat verder proberen om je code te gebruiken, ziet er absoluut niet gemakkelijk uit (dus zo'n beginnende prutser ben je nu ook terug niet :))
 
Hallo,


2de reactie! Werkt perfect!

Net wat ik wilde!

Je bent een Genie :D
 
@ OctaFish

Na verdere controle blijkt het toch niet volledig te werken :confused:

In het begin werkt je code perfect maar later wordt het allerlaatste bestand terug overschreven (ipv het oudste wordt dus het nieuwste bestand overschreven).

Er zal dus nog een kleine aanpassing nodig zijn...
 
@ OctaFish

Is raar...

Heb het programma geschreven in excel 2003 waar het perfect werkte.

Gisteren thuis getest in excel 2007 waar het niet werkte (de laatste backup werd overschreven ipv de oudste). (misschien dat er een instelling verkeerd staat?)

Vandaag wordt er op het werk overgeschakeld op excel 2010 en blijkbaar werkt dit in deze versie terug. Aangezien ik het bestand op het werk gebruik heb ik geluk ;)

Toch bedankt
 
Laten we het de wondere wereld van Microsof noemen :D
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan