Creating a Dated Backup File

by Allen Wyatt
(last updated August 2, 2014)

25

Every time Mathew closes a workbook, he'd like to have Excel create a dated backup of that workbook, meaning that it is saved using a filename that includes the date. Thus, if he saves "AnyWorkbookName," it would save not just under that name, but also under the name "AnyWorkbookName [Today's Date & Time]." Mathew is sure this needs to be done with VBA, but he's not sure how to go about it.

There are any number of macros that could be developed to perform this task. Most all of them are variations on a theme (so to speak), so for our purposes a single example should suffice.

The following macro will, just before closing the workbook, save the workbook with a date and time appended to the end of the filename.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Dim sFileName As String
    Dim sDateTime As String

    With ThisWorkbook
        sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
        sFileName = Application.WorksheetFunction.Substitute _
          (.FullName, ".xlsm", sDateTime)
        .SaveCopyAs sFilename
    End With
End Sub

The macro puts together the date and time string into the sDateTime variable. This is then inserted into the workbook's filename by using the SUBSTITUTE worksheet function. (The date/time string is effectively inserted just before the filename extension.) The macro assumes that the workbook is being saved as an XLSM file because it must contain macros—such as the macro to do this saving.

The macro should be placed in the ThisWorkbook module for the workbook. This ensures that it will execute just before the workbook is closed.

There are, as well, third-party add-ins which can perform this task. The following are a few that you may want to check out.

http://insight.trueinsight.za.com/excel/excel-utilities
http://www.jkp-ads.com/Download.asp#AutoSafe
http://www.asap-utilities.com

ExcelTips is your source for cost-effective Microsoft Excel training. This tip (13195) applies to Microsoft Excel 2007, 2010, and 2013.

Author Bio

Allen Wyatt

With more than 50 non-fiction books and numerous magazine articles to his credit, Allen Wyatt is an internationally recognized author. He  is president of Sharon Parq Associates, a computer and publishing services company. ...

MORE FROM ALLEN

Checking for Incorrect Numbers in Text

One of the grammar rules you can check for in a document is the incorrect use of numbers. If you are unsure when to use ...

Discover More

Making Sure Styles Do Not Update Automatically

One of the features of Word that can cause some problems is one that allows styles to be automatically updated based upon ...

Discover More

Clearing Only Filtering Settings

When you filter data in a worksheet, Excel also allows you to apply sorting orders to that data. Here is a behind-the-scenes ...

Discover More

Create Custom Apps with VBA! Discover how to extend the capabilities of Office 2013 (Word, Excel, PowerPoint, Outlook, and Access) with VBA programming, using it for writing macros, automating Office applications, and creating custom applications. Check out Mastering VBA for Office 2013 today!

More ExcelTips (ribbon)

Saving in Multiple Locations

Need to save a workbook in more than one location? Here's a handy macro that can save your workbook in lots of different ...

Discover More

How Excel Treats Disk Files

Workbooks are loaded from disk files, but workbooks aren't the only type of files that Excel can load. This tip provides a ...

Discover More

Opening a Workbook with Two Windows

If you open a workbook and notice that Excel displays two windows for it, this has to do with how the workbook was saved. ...

Discover More
Subscribe

FREE SERVICE: Get tips like this every week in ExcelTips, a free productivity newsletter. Enter your address and click "Subscribe."

View most recent newsletter.

Comments

If you would like to add an image to your comment (not an avatar, but an image to help in making the point of your comment), include the characters [{fig}] in your comment text. You’ll be prompted to upload your image when you submit the comment. Maximum image size is 6Mpixels. Images larger than 600px wide or 1000px tall will be reduced. Up to three images may be included in a comment. All images are subject to review. Commenting privileges may be curtailed if inappropriate images are posted.

What is four less than 4?

2017-08-01 04:54:41

Govardhan Boga

Please advise, I want to save back file under My documents instead of in the same folder then how do I it?


2017-04-30 06:20:54

Willy Vanhaelen

@Renji Thomas
Simply place both macros in ThisWorkbook. The first will be executed only just before the workbook is closed. The second will run each time you save the workbook even when it is not closed.


2017-04-29 17:02:08

Renji Thomas

Hai, How can I use these both codes at a time?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim sFileName As String
Dim sDateTime As String

With ThisWorkbook
sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
sFileName = Application.WorksheetFunction.Substitute _
(.FullName, ".xlsm", sDateTime)
.SaveCopyAs sFilename
End With
End Sub

Private Sub Workbook_BeforeSave(ByVal _
SaveAsUI As Boolean, Cancel As Boolean)
With ThisWorkbook
.SaveCopyAs ("c:\Backups\Backup of " & .Name)
End With
End Sub


2017-04-29 16:08:55

Renji Thomas

Hai, I already have another macro in 'This Workbook', so how can I add this macro in addition to that?


2016-04-13 09:44:25

Karin

Thanks Allen, Barry, Eric, Willy. That's the best macro tip for backups.

It worked great, I used it for versioning my Excel reports. At some point though I wanted to add comments on these backup files, diff changes, set up some version log, etc. And there is the scaling problem and files piling up >>> over-complicated.

Don't repeat my mistakes and get one step ahead. Now I strongly advocate for proper version control, e.g. https://xltools.net/version-control-for-vba-macros/ or other third-party add-ins. Hope it helps somebody.


2015-05-31 06:16:20

Willy Vanhaelen

@Barry and @Eric

Elegant solution! It isn't necessary to include

Private Sub Workbook_Open()
BackupReqd = False
End Sub

though because when the workbook is opened the default value of BackupReqd is False anyway.


@@@

For who wants to stick with the original approach of this tip, here is a one-line version of Allen's eight lines macro, wich does exactly the same job.

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Me.SaveCopyAs Replace(Me.FullName, ".xlsm", " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm")
End Sub


2015-05-26 05:40:16

Barry

@Eric,

The .Saved property of a Workbook indicates if there are changes that haven't been saved yet. By creating a global/public variable called say BackupReqd, and setting this variable if during the Workbook_BeforeSave event if the .Saved property is False i.e. changes have been made. In effect what this is doing remembering that a change to the Workbook has been made since opening it regardless of any intermediate "saves" being performed.

Then in the Workbook_BeforeClose event if the BackupReqd flag is set or the .Saved flag is false then the backup file should be made.

Public BackupReqd As Boolean

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved = True And BackupReqd = False Then Exit Sub
Dim sDateTime As String, sFileName As String
With ThisWorkbook
sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
sFileName = Replace(.Name, ".xlsm", sDateTime)
.SaveCopyAs .Path & "backup" & sFileName
End With
End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Me.Saved = False Then BackupReqd = True
End Sub

Private Sub Workbook_Open()
BackupReqd = False
End Sub

NB: the BackupReqd variable is declared outside of a procedure, the routines should reside in the "ThisWorkbook" codepage.

Note: this will not detect a change in the Workbook that results in no change e.g. pressing F2 to edit a cell then cancelling the edit with Esc or entering an identical value into an existing cell,; as Excel still perceives this as a change.


2015-05-25 23:57:58

Eric

@Willy and @Barry

@Willy

I finally decided that I had to take out the first line. Getting people to close their input spreadsheet without saving, proved to be a problem. I've just added an apostrophe for now as shown below.


Private Sub Workbook_BeforeClose(Cancel As Boolean)
'If Me.Saved Then Exit Sub
Dim sDateTime As String, sFileName As String
With ThisWorkbook
sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
sFileName = Replace(.Name, ".xlsm", sDateTime)
.SaveCopyAs .Path & "backup" & sFileName
End With
End Sub

@Barry

If I understand you correctly, what you have suggested, kind of acts as a safety net, just in case no saves were made? If so, how would I set the "saved" flag to false? I've searched for this online, but don't seem to find anything that specifically addresses it. (Obviously, I've got to find some time to learn some basics.)


2015-05-22 07:33:51

Barry

@Eric,

Personally I would set the "Saved" flag to FALSE after each save if prior to the save the "Saved" flag was FALSE.

This would ensure a backup was created when the file is closed if any changes had been made irrespective of whether any saves had been made or not.


2015-05-21 18:04:44

Eric Franklin

@Willy

Thanks so much for your help! Your last comment was spot on. It performs exactly like I wanted.

I appreciate your help!

Eric


2015-05-15 05:45:56

Willy Vanhaelen

@Eric
The macro doesn't run when you just save the file. It runs only just before it is closed.

If you first save the file and then close it, the first line of the macro "If Me.Saved Then Exit Sub" prevents the macro from being executed because at that moment the file is saved.

So you must close the file without first saving it. Then Excel asks you if you want to save it. Click Yes.

If this bothers you then remove the first line of code. But then you lose the benefit
that the macro doesn't make a backup when you simply open the file for viewing and then close it without making changes.


2015-05-14 20:11:21

Eric

@Willy

I must be missing something.

I made a change to the spreadsheet.
Then I saved it. (No backup copy made)
Then I closed it. (No backup copy made)

Just for clarification, does it make the backup copy after each save (assuming there is a change made to the file), or once (assuming there is a change made to the file), before closing the sheet?

I am really new to this, but I believe that what you have written should only make one backup and that would be upon closing the file, (assuming there is a change made to the file), which is exactly what I want it to do, but it does not seem to be working.

Any suggestions would be greatly appreciated.


2015-05-14 16:36:27

Eric

@Willy

I must be missing something.

I made a change to the spreadsheet.
Then I saved it. (No backup copy made)
Then I closed it. (No backup copy made)

Just for clarification, does it make the backup copy after each save (assuming there is a change made to the file), or once (assuming there is a change made to the file), before closing the sheet?

I am really new to this, but I believe that what you have written should only make one backup and that would be upon closing the file, (assuming there is a change made to the file), which is exactly what I want it to do, but it does not seem to be working.

Any suggestions would be greatly appreciated.


2015-05-14 07:58:44

Willy Vanhaelen

@Eric
Remember: a backup file is only made if you change something to the file.


2015-05-14 02:03:44

Eric

Willy,

I guess that I spoke too soon. It did create a backup file the first time after I compiled it, but has not created another one yet, after probably 6-7 different attempts.

Is there something else that I forgot to do?

Thanks again for your help!


2015-05-14 00:10:52

Eric

Willy,
Thanks again for your help!
I forgot to compile the macro! After I did that, it worked perfectly! In addition, as I mentioned before, I got the added benefit of not creating another backup when there were no changes made.
This is wonderful.
Thanks for your help!
Eric


2015-05-13 23:35:01

Eric

Thanks, Willy! This sounds like it is better than what I had hoped for, because it fixes the problem of no change backups, if I understand what you wrote correctly!
Is there anything special that I need to do, other than replacing the old macro with this new one and then saving it?
That is what I did and it is saving the original, but not creating the backup copy.
I've made sure that I am making a change to the data, then saving it and then closing the workbook to see if it is creating the backup copy. It has not done so yet.
Thanks again for your help!


2015-05-12 06:11:56

Willy Vanhaelen

@Eric
This macro should do the job:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Me.Saved Then Exit Sub
Dim sDateTime As String, sFileName As String
With ThisWorkbook
sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
sFileName = Replace(.Name, ".xlsm", sDateTime)
.SaveCopyAs .Path & "backup" & sFileName
End With
End Sub

The first line of the macro prevents to make a backup if no changes haven been made to the workbook.

I used de VBA function Replace instead of the worksheet function Substitute which gives shorter code.


2015-05-11 09:16:28

Eric

I realize that this thread is very old, but I hope that someone is still monitoring it. I am a complete newbie to macros, so please make this simple, if possible.

I have been using the original suggestion successfully for 6 months now and it is working great! Thanks to Alan for this code. However, it creates a lot of files within the same folder.

Is there a way to change the macro to a subfolder within the existing folder?

In other words, instead of
C:franklinfilenamewithdateandtime.xlsm,
I would like to save it to:
C:franklinbackupfilenamewithdateandtime.xlsm

The original file would still be saved as:
C:franklinfilename

I am using Excel 2013 and this is the code I am using:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim sFileName As String
Dim sDateTime As String

With ThisWorkbook
sDateTime = " (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
sFileName = Application.WorksheetFunction.Substitute _
(.FullName, ".xlsm", sDateTime)
.SaveCopyAs sFileName
End With
End Sub

Thanks for your help!


2014-08-06 05:34:40

Barry

A simpler solution (although it doesn't create the required file name) is to use the auto backup feature hidden away within Excel.

This is a file-by-file setting but on the "Save As" dialog box click "Tools" then "General Options....". Tick the "Always Create Back Up" and, if you want, tick the "Read Only (recommended)" and/or enter a password.

The file is named "Backup of <original file name>.xlk" the date/time becomes the date/time the back up was created, which if set to "Read Only" should not change.


2014-08-05 10:08:02

Don

Since Andrew & Morris were kind enough to provide additional approches, I thought I would add mine to the discussion.

The following Sub and Function work under the assumption that is a file does not have a date-time stamp then the macro is save a point-in-time archive and if it already has a date-time stamp then the previous file is closed out and the file with the new date-time stamp if the go-forward version.

Sub DateTimeStampSave()
Dim strFileRootName As String
Dim strExt As String
Const strExtMin As String = ".xl"
Const strDateFormat As String = " yyyy-mm-dd"
Const strDateTimeFormat As String = " yyyy-mm-dd hhhnnmsss"
' The backslashes act as excape characters, causing the following character to be treated as literlal
Dim strFormatToUse As String
Dim InpReply As String
strExt = Right(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - InStr(1, ActiveWorkbook.Name, strExtMin) + 1)
strFileRootName = Left(ActiveWorkbook.Name, Len(ActiveWorkbook.Name) - Len(strExt))
If booFileHasDateTimeStamp(strFileRootName, strDateFormat) _
Or booFileHasDateTimeStamp(strFileRootName, strDateTimeFormat) Then
' This part of the IF assumes that a file with a date or date-time stamp will be created and from this point forward the file with _
new name will be the one in use. In this case, the date/date-time stamp is the equivalent of a Created On
If booFileHasDateTimeStamp(strFileRootName, strDateFormat) Then
strFormatToUse = strDateFormat
Else
strFormatToUse = strDateTimeFormat
End If
strFileRootName = Trim(Left(strFileRootName, Len(strFileRootName) - Len(Replace(strTimeDateFormat, "", "")))) ' Eliminates the old date/time-date stamp
ActiveWorkbook.Save ' Saves the final changes to the current file
ActiveWorkbook.SaveAs _
ActiveWorkbook.Path & "" & strFileRootName & Format(Now(), strFormatToUse) & strExt
Else
' The ELSE assumes that a file saved with a date-time stamp from one without one is an archive _
or check point file. The original filename is continued in use. _
In this case, the date/date-time stamp is the equivalent of "Closed On"
Do
InpReply = UCase(InputBox("Enter 'D' for date stamping, 'T' for date & time stamping, 'N' for neither" _
& Chr(10) & "Leave blank or click Cancel to not save the file", "Date/Stime Stamp Save"))
Loop Until Trim(InpReply) = "D" Or InpReply = "T" Or InpReply = "N" Or InpReply = ""
Select Case Trim(InpReply) ' Trim used for inadvertent spaces
Case "" ' This occurs with Cancel or blank and OK
GoTo DateTimeStampSave_EXIT
Case "D"
strFormatToUse = strDateFormat
Case "T"
strFormatToUse = strDateTimeFormat
Case "N"
ActiveWorkbook.Save ' No file with new date/date-time stamp
GoTo DateTimeStampSave_EXIT
End Select
ActiveWorkbook.SaveAs _
ActiveWorkbook.Path & "" & strFileRootName & Format(Now(), strFormatToUse) & strExt
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs _
ActiveWorkbook.Path & "" & strFileRootName & strExt ' Returns to original name
Application.DisplayAlerts = True
End If
DateTimeStampSave_EXIT:
End Sub


Function booFileHasDateTimeStamp(strFileRootName As String, strTimeDateFormat As String) As Boolean
Dim intDateTimeFormatLength As Integer
Dim strPossibleDateTimeStamp As String

Const strExtMin As String = ".xl"
intDateTimeFormatLength = Len(Trim(Replace(strTimeDateFormat, "", "")))
If Len(strFileRootName) > intDateTimeFormatLength Then
strPossibleDateTimeStamp = Right(strFileRootName, intDateTimeFormatLength) 'Len(strFileRootName) -
strPossibleDateTimeStamp = _
Replace(Replace(Replace(UCase(strPossibleDateTimeStamp), "H", ":"), "M", ":"), "S", ":")
If Right(strPossibleDateTimeStamp, 1) = ":" Then _
strPossibleDateTimeStamp = Left(strPossibleDateTimeStamp, Len(strPossibleDateTimeStamp) - 1)
If InStr(1, strPossibleDateTimeStamp, ":") = 0 Then _
strPossibleDateTimeStamp = strPossibleDateTimeStamp & ":00" ' this is used if only the date-time stamp ends at the Hour level
If IsDate(strPossibleDateTimeStamp) Then
booFileHasDateTimeStamp = True
Else
booFileHasDateTimeStamp = False
End If
Else
booFileHasDateTimeStamp = False
End If
End Function


2014-08-05 09:58:59

Don

Another fine question because it generates so much discussion and other ways of doing things. Thanks to everyone who added their much-more-than-two-cents worth.

Ok. Enough of that.

First, a couple of suggestions in the original answer.

The VBA FORMAT function can take literals within it, alleviating the need to add characters to the front an back.
Instead of this:
" (" & Format(Now, "yyyy-mm-dd hhmm") & ").xlsm"
We can have this;
Format(Now, " (yyyy-mm-dd )") & ".xlsm"

I get hinkey when I have code that relies on rules someone else wrote that I need to remember. In this case, it's the rules that cover whether "m" will return minutes or month. Therefore, I use "n" for minutes to avoid some case where I want minutes but end up with the month.

To give context to the time portion of the date-time stamp we use "h" for hours, "m" for minutes, and "s" for seconds. However, since these are reserved characters, i.e. returning values, they must have a preceding backslash ("") to present as literals.
hhhmm

Adding the extension into the FORMAT statement also means adding the backslash before the "s" (which is for seconds), "l" (not certain what this is returning), and "m" (minutes)

So the VBA FORMAT function would look like this, all things added:
Format(Now, " (yyyy-mm-dd hhhnnmsss.xlsm)")


2014-08-04 07:51:27

Bryan

What is the advantage to using Application.WorksheetFunction.Substitute over the Replace() VBA function?

Also I read the problem statement to mean that the original file should also be saved. A .Save needs to be added before the .SaveAs.


2014-08-04 04:51:07

Andrew Evans

Like Morris I have used one based upon a macro I found on the Internet a while ago. I adopted it to use Custom properties and version numbers instead of date / time as an option (I have a mainframe background that used version numbering) and the date and time of the backup is a property of the file anyway.
It also records the source as we have shared areas and sometimes people use the wrong folder when creating the original but hopefully will use the correct backup location (which is part of the original base workbook we give them anyway).

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Dim MyFilePath$, Extension$, BFileName$, BFileType, CurrName
Dim VersNum As Integer, CurrVers As Integer
Dim DoBackup As Boolean
Dim DoDateStamp As Boolean
'
' Obtain Backup parameters from Custom Properties
'
DoBackup = ActiveWorkbook.CustomDocumentProperties("DoBackups")
CurrVers = ActiveWorkbook.CustomDocumentProperties("Version")
MyFilePath = ActiveWorkbook.CustomDocumentProperties("Backup Location")
DoDateStamp = ActiveWorkbook.CustomDocumentProperties("Use Date Stamp Backups")
If DoBackup Then
On Error Resume Next
'
Extension = Right(ThisWorkbook.Name, 3)

If LCase(Extension) = "xls" Then
BFileName = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 4) & " Backup"
BFileType = ".xls"
Else
BFileName = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - 5) & " Backup"
BFileType = Right(ThisWorkbook.Name, 5)
End If

On Error Resume Next ' << Backup Path exists
MkDir MyFilePath
On Error Resume Next '<< folder exists
MkDir MyFilePath & "" & BFileName '<< create folder
'
' Record the source file the backup came from as a record
'
ActiveWorkbook.CustomDocumentProperties("Source") = ActiveWorkbook.FullName
If DoDateStamp Then
ActiveWorkbook.SaveCopyAs Filename:=MyFilePath & "" & _
BFileName & "" & BFileName & _
(Format(Now, " mmm d yyyy, hh-mm-ss AMPM")) & BFileType
Else
ActiveWorkbook.SaveCopyAs Filename:=MyFilePath & "" & _
BFileName & "" & BFileName & " (" & CurrVers & _
")" & BFileType
End If
End If
'
' Even if we are doing time stamp backups (or even no backups) ensure version number information is kept up to date.
VersNum = CurrVers + 1
ActiveWorkbook.CustomDocumentProperties("Version") = VersNum
End Sub



2014-08-02 09:22:51

Morris Manning

I use this code to manually create a backup when clicking the Close button (upper right). It saves a copy with a xlsmBAK extension and then prompts to save as a xlsm file. It can available to all excel workbooks if placed in the PERSONAL workbook or attached to a command button in the current file. This is my variation of code that has been bouncing around the internet for some time.

Sub Save_Workbook_Backup_Via_Command_Button()
'INSTRUCTIONS
'This Excel backup utility can be available to all Excel workbooks if placed in the _
PERSONAL workbook. It may also be called from a sheet command button.

'''''''''''''''''''''''''''''''''''''''''''''''
Dim awb As Workbook, BackupFileName As String, I As Integer, OK As Boolean
Dim iReply As Integer

iReply = MsgBox("RECOMMENDED: To make a backup file with xlsmBAK extension in same location, Select OK or Cancel to exit." _
& vbCrLf & vbCrLf & "NOTE: To open the xlsmBAK file, select, right-click and delete BAK portion of extension. Select YES when prompted to save file to a different file name.", _
vbInformation + vbOKCancel, " RECOMMENDED: BACKUP WORKBOOK")
If iReply = vbCancel Then
Else

If TypeName(ActiveWorkbook) = "Nothing" Then Exit Sub
Set awb = ActiveWorkbook
If awb.Path = "" Then
Application.Dialogs(xlDialogSaveAs).Show
Else
BackupFileName = awb.FullName
I = 0
While InStr(I + 1, BackupFileName, ".") > 0
I = InStr(I + 1, BackupFileName, ".")
Wend
If I > 0 Then BackupFileName = Left(BackupFileName, I - 1)
BackupFileName = BackupFileName & ".xlsmBAK"
OK = False
On Error GoTo NotAbleToSave
With awb
Application.StatusBar = "SAVING BACKUP WITH xlsmBAK EXTENSION..."
.SaveCopyAs BackupFileName
OK = True
End With
End If
'Uncomment the following line if a confirmation of BAK completion is desired.
MsgBox "WORKBOOK BACKUP WITH 'xlsmBAK' EXTENSION COMPLETE!", vbExclamation, ThisWorkbook.Name
NotAbleToSave:
Set awb = Nothing
Application.StatusBar = False
If Not OK Then
MsgBox "BACKUP COPY NOT SAVED!", vbExclamation, ThisWorkbook.Name
End If
End If
Exit Sub
End Sub




This Site

Got a version of Excel that uses the ribbon interface (Excel 2007 or later)? This site is for you! If you use an earlier version of Excel, visit our ExcelTips site focusing on the menu interface.

Newest Tips
Subscribe

FREE SERVICE: Get tips like this every week in ExcelTips, a free productivity newsletter. Enter your address and click "Subscribe."

(Your e-mail address is not shared with anyone, ever.)

View the most recent newsletter.