Thursday, 26 December 2013

Copy Workbook After Save (Excel VBA Event)


During the last week I was working on a VBA project related with dbf files. I spent several hours on code development trying to fix various errors that came up. I created several versions of the code until I feel satisfied with the result. Quite quickly I realized that I have to automate the “saving procedure”. What is the “saving procedure”? Well, a good programming practice, either you writing VBA, or other code, is to save your file just before running the code. In this way, if the code/macro causes something unexpected to your workbook (i.e. deletes a sheet/cell etc.), you can simply close the workbook without saving it, and, then, re-open it; changes occurred by the macro will be disregarded, while your VBA code will be “safe”. Another typical programming practice is to comment out - to “deactivate” a block of code by turning it into a comment. Developers prefer this technique because at any time they can “reactivate” the commented lines and use them normally in the code. This is very helpful when the developer is seeking the optimal solution to an algorithm problem, so he/she tries a solution, then he/she comment out the solution and tries another one (without losing the lines of code that produced the initial solution).

Even if you use both techniques during code development there are times that you will fill confused about which lines produced a working solution. Consider the following scenario: you found an initial solution to your programming problem. However, you believe that this solution is not the optimal one, so you try something else. Your last attempt did not work, so you try another one, and another one, and so on. After some attempts, it is quite possible to have forgotten your initial solution, while your source code will be filled with various comment lines.

In order to avoid the above scenario I wrote a small workbook event procedure (see the VBA code below), which helped me avoid “confusing situations” the previous days. The code uses the Workbook_AfterSave event in order to copy the saved workbook into a specified folder, adding the current date and time at the "copied" workbook path (i.e. the “C:\Users\Christos\Desktop\Copy Workbook After Save (Excel VBA Event).xlsm”, becomes “C:\Users\Christos\Desktop\Tests\Copy Workbook After Save (Excel VBA Event) (2013-12-26 - 15-34-24).xlsm”).

With the procedure below, whenever the user/developer presses the Save button, the workbook and the associated VBA code will be saved, and then the workbook will be copied to a safe location. Each time the user saves the workbook, a new version will be created. If something unexpected occurs, the user will have all the saved versions as back-up, so will lose nothing! Moreover, if he/she gets confused about which lines of code produce a working solution, he/she can simply run the code of the various back-up workbooks; each back-up workbook will contain the VBA code written until the moment it was saved.

VBA code

The code below uses the SaveCopyAs method in order to automate the Workbook_AfterSave event. To use the procedure below, select and copy all the code, open Excel, switch to VBA editor (ALT + F11), select the ThisWorkbook object of you file and paste the code.

Option Explicit

Private Sub Workbook_AfterSave(ByVal Success As Boolean)
    'When the user presses the Save button the macro copies the saved workbook into the selected
    'folder (DestinationFolder) for back-up, adding the current date and time in the file's path.
    'Written by:    Christos Samaras
    'Date:          26/12/2013
    'Declaring the necessary variables.
    Dim DestinationFolder   As String
    Dim WbName              As String
    Dim WbExtension         As String
    Dim WbNewPath           As String
    'Change the folder's path according to your needs.
    DestinationFolder = "C:\Users\Christos\Desktop\Tests"
    'Check if the destination folder exists.
    If DestinationFolder = "" Or Dir(DestinationFolder, vbDirectory) = vbNullString Then
        MsgBox "The destination folder's path is incorect!", vbCritical, "Wrong folder's path"
        Exit Sub
    End If
    'Get the workbook name without the extension.
    WbName = Left(ThisWorkbook.Name, (InStrRev(ThisWorkbook.Name, ".", -1, vbTextCompare) - 1))
    'Get the workbook extension.
    WbExtension = Right$(ThisWorkbook.Name, Len(ThisWorkbook.Name) - InStrRev(ThisWorkbook.Name, "."))
    'Create the new workbook path - add the current date/time at the end.
    WbNewPath = DestinationFolder & "\" & WbName & " (" & Format(Now(), "yyyy-mm-dd - hh-mm-ss") & ")." & WbExtension
    'Copy the current workbook into the destination folder.
    ThisWorkbook.SaveCopyAs WbNewPath
End Sub

I hope that VBA developers will appreciate this small event procedure.



The file can be opened with Excel 2007 or newer. Please enable macros before using it.

Did you like this post? If yes, then share it with your friends. Thank you!


Mechanical Engineer (Ph.D. cand.), M.Sc. Cranfield University, Dipl.-Ing. Aristotle University, Thessaloniki - Greece.
Communication: e-mail, Facebook, Twitter, Google+ and Linkedin. More info