Visual Basic for Applications/Backup Text Boxes on Close
This VBA code is written for Microsoft Excel but is easily adapted to other applications in the MS Office set. It saves all of the text from a user form's text boxes in a log file whenever the form is closed. Then later, on re-opening the form, or at any other time, the user can fill the boxes with the most recent saved text.
The VBA CodeEdit
- The code needs a user form called Userform1, two text boxes, TextBox1 and TextBox2, and a command button called CommandButton1. Set the UserForm1 property ShowModal to false for convenient study. Copy the code below into the three respective modules and save the workbook with an xlsm file suffix.
- Any code that is found in text boxes will be saved when the user form closes. This includes inadvertent closure of the user form or the deliberate closing of the workbook. It does not of course protect against the effect of power failures. The saving of data happens without intervention, so may need consideration if the storage of sensitive data is to be avoided.
- The log file is called SavedText.txt, and will be found in the same folder as the workbook. If a log file of that name is not found, then it will be made by the code for use. The log file has only two fields, the text box name and the string contents found in it. The comma separator was avoided in favor of the less likely encountered string >Break<.
- The saving function runs from the UserForm_QueryClose event. SaveTextBoxes() makes a log string in a userform controls loop, then exports the string via WriteToFile().
- WriteToFile() makes a log file if it does not exist, but otherwise overwrites any text that it finds, so that only the most recently saved session will be found there. Users who employ the logging procedure elsewhere should note that an extra Cr and Lf are stored at the end of logged entries, and might need consideration.
- RestoreTextBoxes() runs only by pressing CommandButton1, so the user chooses whether or not to insert text. GetAllFileText() imports all of the log file's contents at once with the file retaining contents until it is next overwritten. The string is split twice, once to break it into lines, that is, one for each text box record, and then again to break each record into its two fields for matching control names in the main transfer loop.
8 March 2019: Changed data separator from comma to other, in Standard Module
For the ThisWorkbook ModuleEdit
'............................................... ' Notes: Code needs a user form named UserForm1, ' with two text boxes, TextBox1 and Textbox2, ' and a command button with name CommandButton1. ' Set UserForm1 property ShowModal to False '............................................... Private Sub Workbook_Open() 'Runs on opening the workbook Load UserForm1 UserForm1.Show End Sub
For the Userform1 ModuleEdit
Private Sub CommandButton1_Click() ' Restores saved textbox text ' after reopening the user form ' restores textbox text from file RestoreTextBoxes 'set insertion point to TextBox1 With TextBox1 .SelStart = Len(.Value) 'to end of text .SelLength = 0 'just insertion .SetFocus End With End Sub Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) ' Runs before closing the userform ' Used here to save textbox values in a log file SaveTextBoxes End Sub
For the Standard ModuleEdit
Option Explicit Sub SaveTextBoxes() ' Saves values from user form text boxes to a log file ' Data is never lost while log file exists ' Runs in the UserForm_QueryClose() event at all times. Dim oForm As UserForm, oCont As Control, sStringOut As String Dim bCont As Boolean, sPath As String, sLogPath As String Dim sType As String Set oForm = UserForm1 sPath = Application.ThisWorkbook.Path sLogPath = sPath & "\" & "SavedText.txt" 'log file address sType = "TextBox" 'step through the form controls to find the textboxes For Each oCont In oForm.Controls If TypeName(oCont) = sType Then sStringOut = sStringOut & oCont.Name & ">Break<" & oCont.Value & vbCrLf End If Next oCont 'remove tailend Cr and Lf sStringOut = Left$(sStringOut, Len(sStringOut) - 2) 'send textbox string to the log file WriteToFile sStringOut, sLogPath 'release object variables Set oForm = Nothing Set oCont = Nothing End Sub Function WriteToFile(ByVal sIn As String, ByVal sPath As String) As Boolean ' REPLACES all content of a text file with parameter string ' Makes the file if it does not exist ' Assumes that all formatting is already in sIn ' Note that this log file will add Cr and Lf to the stored string Dim Number As Integer Number = FreeFile 'Get a file number 'write string to file Open sPath For Output As #Number Print #Number, sIn Close #Number WriteToFile = True End Function Sub RestoreTextBoxes() ' Restores saved values to user form text boxes. ' Data is never lost while log file exists. ' Runs when CommandButton1 is pressed Dim oCont As Control, oForm As UserForm Dim vA As Variant, vB As Variant, sRet As String Dim sPath As String, sLogPath As String, nC As Long Set oForm = UserForm1 sPath = Application.ThisWorkbook.Path sLogPath = sPath & "\" & "SavedText.txt" 'get text from the log file GetAllFileText sLogPath, sRet 'remove the extra Cr and Lf added by the log file sRet = Left(sRet, Len(sRet) - 2) 'step through controls to match up text vA = Split(sRet, vbCrLf) For nC = LBound(vA, 1) To UBound(vA, 1) 'MsgBox Asc(vA(nC)) vB = Split(vA(nC), ">Break<") For Each oCont In oForm.Controls If oCont.Name = vB(0) Then oCont.Value = vB(1) End If Next oCont Next nC 'release object variables Set oForm = Nothing Set oCont = Nothing End Sub Function GetAllFileText(ByVal sPath As String, sRet As String) As Boolean ' Returns entire log file text in sRet ' Note that this log file will add Cr and Lf to the original string Dim Number As Integer 'get next file number Number = FreeFile 'Open file Open sPath For Input As Number 'get entire file content sRet = Input(LOF(Number), Number) 'Close File Close Number 'transfers GetAllFileText = True End Function