Hi Guys,
Been trawling though all the posts and appear to have found something that hasn't already been answered (long shot I know!).
Here's my full code:
Sub SalesPersonCopy()
Dim Sh As Worksheet
Dim Master As Workbook
Dim Rng As Range
Dim c As Range
Dim List As New Collection
Dim Item As Variant
Dim WB As Workbook
Dim MSG1 As Integer
Dim MSG2 As Integer
Dim Shp As Shape
Dim FName As String
'check to ensure user wants to continue
MSG1 = MsgBox("This will produce seperate Excel review documents for each Sales Person, and will take some time. Are you sure you want to continue?", vbYesNo, "Do you want to continue?")
If MSG1 = vbYes Then
MSG2 = MsgBox("This will overide any previous files that have been produce today. Are you sure you want to continue?", vbYesNo, "Do you want to continue?")
If MSG2 = vbYes Then
'set update perameters to speed up calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.CalculateBeforeSave = False
Application.DisplayAlerts = False
'set up the copy workbook
Set Master = ThisWorkbook
Set Sh = Worksheets("Sage Update Summary")
Sh.Unprotect
Set Rng = Sh.Range("B8:B" & Sh.Range("A1048576").End(xlUp).Row)
'Produce a list of unique sales people
On Error Resume Next
For Each c In Rng
List.Add c.Value, CStr(c.Value)
Next c
On Error GoTo 0
'set copy range
Set Rng = Sh.Range("A7:GT" & Sh.Range("A1048576").End(xlUp).Row)
'copy each sales persons filtered lines to seperate worksheet
For Each Item In List
Set WB = Workbooks.Add
Sh.Range("A1:GT6").Copy WB.Worksheets(1).Range("A1")
Rng.AutoFilter Field:=2, Criteria1:=Item
Rng.SpecialCells(xlCellTypeVisible).Copy WB.Worksheets(1).Range("A7")
'add back revenue formulae
WB.Worksheets(1).Range("DF8:" & "DH" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("DM8:" & "DO" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("DT8:" & "DV" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("EA8:" & "EC" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("EH8:" & "EJ" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("EO8:" & "EQ" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("EV8:" & "EX" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("FC8:" & "FE" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("FJ8:" & "FL" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("FQ8:" & "FS" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("FX8:" & "FZ" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
WB.Worksheets(1).Range("GE8:" & "GG" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=RC[-94]*RC104"
'add in total formulae
WB.Worksheets(1).Range("L" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row + 2 & ":GR" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row + 2).FormulaR1C1 = "=SUBTOTAL(109,R8C:R[-1]C)"
WB.Worksheets(1).Range("GH8:" & "GN" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=SUMIF(R7C97:R7C180,R7C,RC97:RC180)"
WB.Worksheets(1).Range("GP8:" & "GQ" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).FormulaR1C1 = "=SUM(RC183:RC187)-RC[-8]"
'format the total formulae
With WB.Worksheets(1).Range("L" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row & ":GR" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With WB.Worksheets(1).Range("L" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row & ":GR" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).Borders(xlEdgeBottom)
.LineStyle = xlDouble
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThick
End With
WB.Worksheets(1).Range("L" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row & ":GR" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).Style = "Comma"
WB.Worksheets(1).Range("L" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row & ":GR" & WB.Worksheets(1).Range("L1048576").End(xlUp).Row).Font.Bold = True
'resize the columns
WB.Worksheets(1).Columns("A").ColumnWidth = 32
WB.Worksheets(1).Columns("B").ColumnWidth = 14
WB.Worksheets(1).Columns("C").ColumnWidth = 11.75
WB.Worksheets(1).Columns("D").ColumnWidth = 13.88
WB.Worksheets(1).Columns("E").ColumnWidth = 29
WB.Worksheets(1).Columns("F").ColumnWidth = 14
WB.Worksheets(1).Columns("G").ColumnWidth = 17
WB.Worksheets(1).Columns("H").ColumnWidth = 32.75
WB.Worksheets(1).Columns("I").ColumnWidth = 21
WB.Worksheets(1).Columns("J").ColumnWidth = 6.75
WB.Worksheets(1).Columns("K").ColumnWidth = 1.75
WB.Worksheets(1).Columns("L:GT").ColumnWidth = 17.25
WB.Worksheets(1).Columns("CY").ColumnWidth = 1.75
WB.Worksheets(1).Columns("DA").ColumnWidth = 1.75
WB.Worksheets(1).Columns("GO").ColumnWidth = 1.75
WB.Worksheets(1).Columns("GS").ColumnWidth = 1.75
WB.Worksheets(1).Columns("GT").ColumnWidth = 70
WB.Worksheets(1).Rows("7").AutoFilter
'remove macro button
For Each Shp In ActiveSheet.Shapes
Shp.Delete
Next Shp
'fix the window zoom to 70%
ActiveWindow.Zoom = 70
'Remove the filter on original data
Rng.AutoFilter
'copy sheet macro
With Master
FName = .Path & "code.bas"
.VBProject.VBComponents("Sheet6").Export FName
End With
WB.VBProject.VBComponents.Import FName
Kill FName
'save the new workbook with unique name based upon sales person
With WB
.SaveAs ThisWorkbook.Path & "\Sales Forecast Sheet - " & Format(Now(), "ddmmyy") & " - " & Item & ".xlsm", FileFormat:=52, AccessMode:=xlExclusive, ConflictResolution:=Excel.XlSaveConflictResolution.xlLocalSessionChanges
.Close
End With
Next Item
'once complete, return to original data and refilter
Sh.Activate
Sh.Rows("7").AutoFilter
'remove update parameters to bring Excel back to standard state
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.CalculateBeforeSave = True
Application.DisplayAlerts = True
'protect sheet
Sh.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowInsertingRows:=True, AllowFiltering:=True, AllowSorting:=True
Application.ScreenUpdating = True
MsgBox "The process has completed successfully, please check the folder for distributable reports.", , "Process Complete"
Else
End If
Else
End If
End Sub
I am copying a load of filtered data to separate worksheets for use by different sales people... They're bound to try and break things, so their final files have protection enabled... They need to be able to insert extra rows of data, so I have built a macro that unprotects and copies various formulas to the inserted row when it detects a row is inserted. Here's the code for the macro I wish to insert into the sheet object:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Cells.Count = 16384 Then
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.CalculateBeforeSave = False
Application.DisplayAlerts = False
ActiveSheet.Unprotect
Range("CR" & Target.Row & ":GR" & Target.Row).Offset(-1, 0).Select
Selection.Copy
Range(ActiveCell.Address).Offset(1, 0).Select
Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Range("CZ" & Target.Row) = 1
Range("DB" & Target.Row & ":DE" & Target.Row) = 0
Range("DI" & Target.Row & ":DL" & Target.Row) = 0
Range("DP" & Target.Row & ":DS" & Target.Row) = 0
Range("DW" & Target.Row & ":DZ" & Target.Row) = 0
Range("ED" & Target.Row & ":EG" & Target.Row) = 0
Range("EK" & Target.Row & ":EN" & Target.Row) = 0
Range("ER" & Target.Row & ":EU" & Target.Row) = 0
Range("EY" & Target.Row & ":FB" & Target.Row) = 0
Range("FF" & Target.Row & ":FI" & Target.Row) = 0
Range("FM" & Target.Row & ":FP" & Target.Row) = 0
Range("FT" & Target.Row & ":FW" & Target.Row) = 0
Range("GA" & Target.Row & ":GD" & Target.Row) = 0
Range("A" & Target.Row).Select
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowInsertingRows:=True, AllowFiltering:=True, AllowSorting:=True
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.CalculateBeforeSave = True
Application.DisplayAlerts = True
End If
End Sub
You can see in the "copy sheet macro" of my first code that I am copying the macro from Sheet6... I then want to paste it into Sheet1 of the new workbook:
'copy sheet macro
With Master
FName = .Path & "code.bas"
.VBProject.VBComponents("Sheet6").Export FName
End With
WB.VBProject.VBComponents.Import FName
Kill FName
Unfortunately, this creates a class module which means it doesn't activate when a row is inserted on Sheet1. When I try and define the VBComponents as Sheet1 the macro breaks stating "Object doesn't support this property or method".
Thanks for any help you guys can give!!!
crabby
Bookmarks