You can use this edited code -
Sub copy_data()
Dim NewFN As String, MasterFN As String, UserA As String, UserB As String
Dim lrow As Long, i As Long, drow As Long
Dim rngf As Range, rngv As Range
Dim SName As Variant
'Open the Master file
proceed:
MasterFN = Application.GetOpenFilename(FileFilter:="All files (*.*), *.*", Title:="Please open the Master File")
If MasterFN = "" Then
MsgBox "You have not selected a file."
GoTo proceed
Else
Workbooks.Open Filename:=MasterFN
End If
MasterFN = ActiveWorkbook.Name
'Open the test file
proceed1:
NewFN = Application.GetOpenFilename(FileFilter:="All files (*.*), *.*", Title:="Please select a file")
If NewFN = "" Then
MsgBox "You have not selected a file."
GoTo proceed1
Else
Workbooks.Open Filename:=NewFN
End If
'Save backup file
ActiveWorkbook.SaveAs Filename:="D:\Counts-" & Format(Date, "dd-mmm-yy") & ".xlsx", FileFormat:= _
xlOpenXMLWorkbook, CreateBackup:=False
Workbooks("Counts-" & Format(Date, "dd-mmm-yy") & ".xlsx").Close
Workbooks.Open Filename:=NewFN
NewFN = ActiveWorkbook.Name
'Delete the "to be removed" IDs
Workbooks(NewFN).Activate
lrow = Worksheets("To be removed").Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To lrow
Worksheets("Raw").Rows("1:1").AutoFilter field:=1, Criteria1:=Worksheets("To be removed").Range("A" & i).Value
With ActiveSheet
Set rngf = .AutoFilter.Range
If rngf.Columns(1).Cells.SpecialCells(xlCellTypeVisible) _
.Cells.Count = 1 Then
GoTo cont
End If
End With
With rngf 'ignore the header from the count and come down one row
'On Error GoTo extra
Set rngv = .Resize(.Rows.Count - 1, 1).Offset(1, 0).Cells.SpecialCells(xlCellTypeVisible)
End With
rngv.Next.EntireRow.Delete
cont:
Next i
Worksheets("Raw").Rows("1:1").AutoFilter
lrow = Worksheets("Raw").Range("A" & Rows.Count).End(xlUp).Row
For i = 2 To lrow
update_data:
SName = Workbooks(NewFN).Worksheets("Raw").Range("A" & i).Value
On Error GoTo new_tab
Workbooks(NewFN).Worksheets("Raw").Range("A" & i & ":I" & i).Copy Workbooks(MasterFN).Worksheets(SName).Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
Workbooks(MasterFN).Worksheets(SName).Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Format(Date, "dd-mmm-yy")
drow = Workbooks(MasterFN).Worksheets(SName).Range("K" & Rows.Count).End(xlUp).Offset(1, 0).Row
Workbooks(MasterFN).Worksheets(SName).Range("K" & drow - 1 & ":S" & drow - 1).Copy Workbooks(MasterFN).Worksheets(SName).Range("K" & drow & ":S" & drow)
Next i
new_tab:
MsgBox "New Name encountered", vbCritical
UserA = InputBox("Should a new sheet be inserted for the new name?", "New Name", "Yes")
If UserA = "Yes" Then
Workbooks(MasterFN).Sheets.Add(after:=Workbooks(MasterFN).Sheets(Worksheets.Count)).Name = SName
Else: UserA = "No"
UserB = InputBox("Specify the name of the sheet where the data should be merged")
SName = UserB
End If
Workbooks(NewFN).Worksheets("Raw").Range("A" & i & ":I" & i).Copy Workbooks(MasterFN).Worksheets(SName).Range("B" & Rows.Count).End(xlUp).Offset(1, 0)
Workbooks(MasterFN).Worksheets(SName).Range("A" & Rows.Count).End(xlUp).Offset(1, 0).Value = Format(Date, "dd-mmm-yy")
drow = Workbooks(MasterFN).Worksheets(SName).Range("K" & Rows.Count).End(xlUp).Offset(1, 0).Row
Workbooks(MasterFN).Worksheets(SName).Range("K" & drow - 1 & ":S" & drow - 1).Copy Workbooks(MasterFN).Worksheets(SName).Range("K" & drow & ":S" & drow)
If UserA = "" Then
MsgBox "This work is now complete"
ElseIf UserA = "Yes" Then
MsgBox "This work is now complete, new sheet added - " & SName
ElseIf UserA = "No" Then
MsgBox "This work is now complete, merged with sheet " & UserB
End If
End Sub
I have declared "SName" (name of the sheet in the master file) as a variant. So you can even use the IDs instead of name. Let me know if you face any issues with the code.
Bookmarks