I have an excel file with multiple sheets. On one sheet of the “Daily Tracker” I have some data on the page, which in my code I designated this range as “DailyTable”, which contains the data I want to copy.
As soon as the data is completely filled out for a week, I want to have a few things.
- The data in the DailyTable is copied to the Daily Backup under the last row of data. [It works for me]
- Before “DailyTable” is copied, it checks for duplicate data [prevents the backup macro from clicking and duplicating data again.]
- If the data is duplicated, a notification lets the user know that they already support the data this week.
- I will have another script, clear the data, mark the week # up to 1. You see some variables entered here when I tested this process before. If there is a better way to do this, I would like to hear thoughts.
My first VBA script (please point out what is inefficient or what is best done differently, I am very open to learning how and why everything works):
Sub BackupTable()
Dim DailyWS As Worksheet
Dim DailyTable As Range
Dim BackupWS As Worksheet
Dim NewTable As Range
Dim Week As Range
Dim WeekBackup As Range
Dim WeekCurrent As String
Dim WeekNext As String
Dim NextRow As Long
Set BackupWS = Worksheets("Daily Backup")
Set DailyWS = Worksheets("Daily Tracker")
Set DailyTable = DailyWS.Range("C7:Q21")
Set Week = DailyWS.Range("F4")
WeekNext = Week.Value + 1
NextRow = BackupWS.UsedRange.Rows.Count + ActiveSheet.UsedRange.Rows(1).Row
Set WeekBackup = BackupWS.Range("A1").Offset(RowOffSet:=NextRow, ColumnOffset:=0)
Set NewTable = BackupWS.Range("C1:Q15").Offset(RowOffSet:=NextRow, ColumnOffset:=0)
WeekBackup.Value = Week.Value
NewTable.Value = DailyTable.Value
Increases Daily Table Week # by 1.
Week = WeekNext
End Sub
I am sure this looks horrible, but any help would be appreciated. I wish to learn.
==================================================== ============================
2/15:. , , .
Sub ClearDailySheet()
'Declare the variable ranges.
Dim tB As Workbook
Dim DailyWS As Worksheet
Dim DailyTable As Range
Dim BackupWS As Worksheet
Dim NewTable As Range
Dim Oldtable As Range
Dim Week As Range
Dim LastWeek As Range
Dim WeekBackup As Range
Dim LastRow As Long
Dim NextRow As Long
Set tB = ThisWorkbook
With tB
Set BackupWS = .Sheets("Daily Tracker Backup")
Set DailyWS = .Sheets("Daily Tracker")
End With 'tB
With DailyWS
Set DailyTable = .Range("C7:Q21")
Set Week = .Range("F4")
End With 'DailyWS
With BackupWS
NextRow = .Range("C" & .Rows.Count).End(xlUp).Row + 1
Set WeekBackup = .Range("A1").Offset(NextRow, 0)
Set NewTable = .Range("C1:Q15").Offset(NextRow, 0)
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row - 1
Set LastWeek = .Range("A1").Offset(LastRow, 0)
Set Oldtable = .Range("C1:Q15").Offset(LastRow, 0)
End With 'BackupWS
If LastWeek.Value <> Week.Value Then
'''Normal backup
If vbYes <> MsgBox("Oops! Your daily tracker data for this week has not yet been backed up," & vbCrLf & _
"before resetting this form we recommend backing up your data. Proceed with backup? [RECOMMENDED]", vbYesNo + vbQuestion, _
"Missing Backup") Then
'''Avoid backing up now
MsgBox "It is NOT recommended to reset the daily sheet without backing up this week data.", vbExclamation + vbOKOnly
Exit Sub
Else
'''Transfer the data
WeekBackup.Value = Week.Value
NewTable.Value = DailyTable.Value
'''Notify User Backup Complete.
MsgBox "Backup: COMPLETED [Week #" & Week.Value & "]", vbInformation + vbOKOnly
'''Confirm Clear Data
If vbNo <> MsgBox("Reset Daily Tracker [Clear Current Data]" & vbCrLf & _
"" & vbCrLf & _
"Are you SURE you want to reset the daily tracker?" & vbCrLf & _
"This canNOT be undone!", _
vbYesNo + vbCritical, "Confirm Daily Data Reset") Then
'''Clear input form
Clear_InputForm DailyWS
'''Increases Daily Table Week
Week.Value = Week.Value + 1
'''Notify User Backup Complete.
MsgBox "Backup & Data Reset: COMPLETED!" & vbCrLf & _
"" & vbCrLf & _
"[Daily Tracker is ready for the new week!]", vbInformation + vbOKOnly
Else
'''What to do if they don't want to overwrite?
MsgBox "Data Reset CANCELLED", vbExclamation + vbOKOnly
Exit Sub
End If
End If
Else
'''Data already present
If vbYes <> MsgBox("This weeks tracker data (week #" & Week.Value & ") appears to be backed up already," & vbCrLf & _
"do you want to overwrite the old backup with the latest data before resetting the tracker? [RECOMENDED]", vbYesNo + vbQuestion, _
"Backup Data Exists") Then
'''What to do if they don't want to overwrite?
MsgBox "Backup & Data Reset: CANCELLED!", vbExclamation + vbOKOnly
Else
'''Overwrite backup
Oldtable.Value = DailyTable.Value
MsgBox "Backup Overwrite: COMPLETED [Week #" & Week.Value & "]", vbInformation + vbOKOnly
'''Confirm Clear Data
If vbNo <> MsgBox("Reset Daily Tracker [Clear Current Data]" & vbCrLf & _
"" & vbCrLf & _
"Are you SURE you want to reset the daily tracker?" & vbCrLf & _
"This canNOT be undone!", _
vbYesNo + vbCritical, "Confirm Daily Data Reset") Then
'''Clear input form
Clear_InputForm DailyWS
'''Increases Daily Table Week
Week.Value = Week.Value + 1
'''Notify User Backup Complete.
MsgBox "Backup & Data Reset: COMPLETED!" & vbCrLf & _
"" & vbCrLf & _
"[Daily Tracker is ready for the new week!]", vbInformation + vbOKOnly
Else
'''What to do if they don't want to overwrite?
MsgBox "Data Reset: CANCELLED!", vbExclamation + vbOKOnly
End If
End If
End If
End Sub
Private Sub Clear_InputForm(SheetToClean As Worksheet)
'''Actual Range
SheetToClean.Range("D8:L8,N8,O8,P8,Q8,D13:D19,F13:I19,K13:Q19").Select
'''Test Range
'SheetToClean.Range("D31,F31,G31,H31,I31,K31,L31,M31,N31,O31,P31,Q31").ClearContents
End Sub
Sub BackupData()
'Declare the variable ranges.
Dim tB As Workbook
Dim DailyWS As Worksheet
Dim DailyTable As Range
Dim BackupWS As Worksheet
Dim NewTable As Range
Dim Oldtable As Range
Dim Week As Range
Dim LastWeek As Range
Dim WeekBackup As Range
Dim LastRow As Long
Dim NextRow As Long
Set tB = ThisWorkbook
With tB
Set BackupWS = .Sheets("Daily Tracker Backup")
Set DailyWS = .Sheets("Daily Tracker")
End With 'tB
With DailyWS
Set DailyTable = .Range("C7:Q21")
Set Week = .Range("F4")
End With 'DailyWS
With BackupWS
NextRow = .Range("C" & .Rows.Count).End(xlUp).Row + 1
Set WeekBackup = .Range("A1").Offset(NextRow, 0)
Set NewTable = .Range("C1:Q15").Offset(NextRow, 0)
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row - 1
Set LastWeek = .Range("A1").Offset(LastRow, 0)
Set Oldtable = .Range("C1:Q15").Offset(LastRow, 0)
End With 'BackupWS
If LastWeek.Value <> Week.Value Then
'''Normal backup
If vbYes <> MsgBox("Backing up your daily tracker sheet. You can do this anytime you'd like" & vbCrLf & _
"throughout the week. This will simply make a backup of your daily" & vbCrLf & _
"data in the 'Daily Tracker Backup' tab. Do you want to proceed?", vbYesNo + vbQuestion, _
"Backup Daily Tracker Data") Then
'''Avoid backing up now
MsgBox "BACKUP CANCELLED!", vbInformation + vbOKOnly
Exit Sub
Else
'''Transfer the data
WeekBackup.Value = Week.Value
NewTable.Value = DailyTable.Value
'''Notify User Backup Complete.
MsgBox "BACKUP SUCCESSFUL: Week
Exit Sub
End If
Else
'''Data already present
If vbYes <> MsgBox("This weeks daily data (Week #" & Week.Value & ") is already backedup," & vbCrLf & _
"do you want to update this backup [overwrite it]?", vbYesNo + vbQuestion, _
"Backup Data Exists") Then
'''What to do if they don't want to overwrite?
MsgBox "BACKUP CANCELLED!", vbInformation + vbOKOnly
Exit Sub
Else
'''Overwrite backup
Oldtable.Value = DailyTable.Value
MsgBox "BACKUP OVEWRITE SUCCESSFUL: Week #" & Week.Value, vbInformation + vbOKOnly
End If
End If
End Sub