Excel VBA-复制前检查范围内的数据是否已存在
我有一个excel文件和几张表格。在一张“每日跟踪器”的页面上,我有一些数据,在我的代码中,我将这个范围标记为“DailyTable”,其中包含我想要复制的数据 一旦本周的数据全部填写完毕,我希望有几件事情发生Excel VBA-复制前检查范围内的数据是否已存在,vba,excel,Vba,Excel,我有一个excel文件和几张表格。在一张“每日跟踪器”的页面上,我有一些数据,在我的代码中,我将这个范围标记为“DailyTable”,其中包含我想要复制的数据 一旦本周的数据全部填写完毕,我希望有几件事情发生 “DailyTable”中的数据复制到最后一行数据下的“Daily Backup”中。[我有这个工作] 在复制“DailyTable”之前,它会检查重复数据[防止多次按下备份宏并产生重复数据。] 如果数据重复,则会发出通知,告知用户他们已经备份了本周的数据 我将使用另一个脚本清除数据,将
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's 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 # by 1 after reset.
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 # by 1 after reset.
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 #" & Week, vbInformation + vbOKOnly
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
子ClearDailySheet()
'声明变量范围。
将tB设置为工作簿
将日常工作作为工作表进行调整
昏暗的日常工作台
将备份设置为工作表
可调范围
将旧表变暗为范围
暗淡的一周
上周暗淡如射程
暗淡的周备份范围
最后一排一样长
暗淡的下一步一样长
设置tB=ThisWorkbook
结核病
设置备份=.Sheets(“每日跟踪备份”)
设置DailyWS=.Sheets(“每日跟踪器”)
以“tB”结尾
每日新闻
设置DailyTable=.Range(“C7:Q21”)
设置周=.范围(“F4”)
以“每日新闻”结尾
背负
NextRow=.Range(“C”和.Rows.Count).End(xlUp).Row+1
设置WeekBackup=.Range(“A1”).Offset(下一步,0)
设置新表=.Range(“C1:Q15”).Offset(下一步,0)
LastRow=.Range(“A”&.Rows.Count).End(xlUp).Row-1
设置LastWeek=.Range(“A1”).Offset(LastRow,0)
设置旧表=.Range(“C1:Q15”).Offset(最后一行,0)
以“后退”结束
如果上周。价值周。价值那么
''正常备份
如果vbYes MsgBox(“哎呀!您本周的每日跟踪器数据尚未备份,”&vbCrLf&_
“在重置此表单之前,我们建议备份数据。是否继续备份?[建议]”,vbYesNo+vbQuestion_
“缺少备份”)然后
''现在避免备份
MsgBox“不建议在不备份本周数据的情况下重置每日工作表。”,vbequipment+vbOKOnly
出口接头
其他的
''传输数据
WeekBackup.Value=Week.Value
NewTable.Value=DailyTable.Value
''通知用户备份完成。
MsgBox“备份:已完成[Week#”&Week.Value&“]”,vbInformation+vbOKOnly
''确认清晰的数据
如果vbNo MsgBox(“重置每日跟踪器[清除当前数据]”&vbCrLf&_
“”&vbCrLf&_
“是否确实要重置每日跟踪器?”&vbCrLf&_
“此操作无法撤消!”_
vbYesNo+vbCritical,“确认每日数据重置”),然后
''清除输入表单
清除\u输入表单DailyWS
重置后,''增加每日表周1。
周值=周值+1
''通知用户备份完成。
MsgBox“备份和数据重置:完成!”&vbCrLf&_
“”&vbCrLf&_
“[Daily Tracker已准备好迎接新的一周!]”,vbInformation+vbOKOnly
其他的
''如果他们不想覆盖怎么办?
MsgBox“数据重置已取消”,VBEQUOTION+vbOKOnly
出口接头
如果结束
如果结束
其他的
''数据已经存在
如果vbYes MsgBox(“本周跟踪数据(周#“&week.Value&”)显示已备份,”&vbCrLf&_
“是否要在重置跟踪器之前用最新数据覆盖旧备份?[建议]”,vbYesNo+vbQuestion_
“备份数据存在”),然后
''如果他们不想覆盖怎么办?
MsgBox“备份和数据重置:已取消!”,VBEQUOTION+vbOKOnly
其他的
''覆盖备份
Oldtable.Value=DailyTable.Value
MsgBox“备份覆盖:已完成[Week#”&Week.Value&“]”,vbInformation+vbOKOnly
''确认清晰的数据
如果vbNo MsgBox(“重置每日跟踪器[清除当前数据]”&vbCrLf&_
“”&vbCrLf&_
“是否确实要重置每日跟踪器?”&vbCrLf&_
“此操作无法撤消!”_
vbYesNo+vbCritical,“确认每日数据重置”),然后
''清除输入表单
清除\u输入表单DailyWS
重置后,''增加每日表周1。
周值=周值+1
''通知用户备份完成。
MsgBox“备份和数据重置:完成!”&vbCrLf&_
“”&vbCrLf&_
“[Daily Tracker已准备好迎接新的一周!]”,vbInformation+vbOKOnly
其他的
''如果他们不想覆盖怎么办?
MsgBox“数据重置:取消
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's 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 # by 1 after reset.
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 # by 1 after reset.
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 #" & Week, vbInformation + vbOKOnly
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
Sub BackupTable()
Dim tB As Workbook
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 tB = ThisWorkbook
With tB
Set BackupWS = .Sheets("Daily 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)
End With 'BackupWS
'''Transfer the data
WeekBackup.Value = Week.Value
NewTable.Value = DailyTable.Value
'''Apply RemoveDuplicates (2 parameters):
'''(the array tells which columns it should take into accout to detect duplicates)
'''(xlGuess let excel guess if you have Headers, or set it to xlYes or xlNo)
Call BackupWS.UsedRange.RemoveDuplicates(Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17), xlGuess)
'''Increases Daily Table Week # by 1.
Week.Value = Week.Value + 1
End Sub
'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("Your daily tracker data has not been backed up," & vbCrLf & _
"do you want to backup your data up now?", vbYesNo + vbQuestion, _
"Missing Backup for this Week") Then
'''Avoid backing up now
Exit Sub
Else
'''Confirm Clear Data
If vbNo <> MsgBox("This will reset this section." & vbCrLf & _
"Are you SURE you want to reset your daily data sheet?" & vbCrLf & _
"This canNOT be undone!", _
vbYesNo + vbCritical, "Confirm Daily Data Wipe") Then
'''Transfer the data
WeekBackup.Value = Week.Value
NewTable.Value = DailyTable.Value
'''Clear input form
Clear_InputForm DailyWS
'''Increases Daily Table Week # by 1 after reset.
Week.Value = Week.Value + 1
'''Notify User Backup Complete.
MsgBox "BACKUP COMPLETE: Week #" & Week, vbInformation + vbOKOnly
Else
'''What to do if they don't want to overwrite?
Exit Sub
End If
End If
Else
'''Data already present
If vbYes <> MsgBox("This weeks (" & Week.Value & ") daily data appears to be backedup already," & vbCrLf & _
"do you want to overwrite the existing backup?", vbYesNo + vbQuestion, _
"Backup Data Exists") Then
'''What to do if they don't want to overwrite?
Exit Sub
Else
'''Overwrite backup
Oldtable.Value = DailyTable.Value
'''Clear input form
Clear_InputForm DailyWS
MsgBox "BACKUP OVEWRITE COMPLETE: Week #" & Week.Value, vbInformation + vbOKOnly
End If
End If
End Sub
Private Sub Clear_InputForm(SheetToClean As Worksheet)
'''Actual Range (avoid using select which is slow)
'SheetToClean.Range("D8:L8,N8,O8,P8,Q8,D13:D19,F13:I19,K13:Q19").ClearContents
'''Test Range (use select to see which range you are gonna clear)
SheetToClean.Range("D31,F31,G31,H31,I31,K31,L31,M31,N31,O31,P31,Q31").Select
'Selection.ClearContents
End Sub