Generate Multiple Tabbed Sheets From Master List
Suppose you have a single worksheet, sorted in order by sales reps. Let's say the list contains 100 different sales reps, and your goal is to create a unique worksheet tab for each sales rep (giving a total of 101 worksheets within one workbook). The following example illustrates the code necessary to accomplish this.
For this code structure, you will need the original master worksheet (Sheets(1)) and you must create a FORMATTED 2nd worksheet (Sheets(2)) that will be the target of each sales reps performance. (For this example, I'm using a sorted field called BodyCode, but let's assume it is a sales reps full name).
Comments in the code will guide your coding efforts.
Program Code
Option Explicit Public Sub CreateBodyCodeSheets() Dim wksMaster As Worksheet Dim wksBodyCode As Worksheet Dim rngKeyRange As Range Dim C As Range Dim rngSubTotals As Range Dim rngBorders As Range Dim lngLastRowInMaster As Long Dim lngNumberOfRowsInBodyCodeSheet As Long Dim intNumberOfBodyCodes As Integer Dim strLastBodyCode As String Dim i As Integer Dim lngStartingRow As Long Dim lngEndingRow As Long Dim intSheetToPopulate As Integer Dim lngTotalsRowNumber As Long ' ******************************************************** ' Turn Off Screen Updating ' ******************************************************** Application.ScreenUpdating = False Set wksMaster = Sheets("2010_2011Sales") Set wksBodyCode = Sheets("BodyCode") lngLastRowInMaster = wksMaster.Cells(Rows.Count, "A").End(xlUp).Row Set rngKeyRange = Range(Cells(5, 1), Cells(lngLastRowInMaster, 1)) strLastBodyCode = wksMaster.Cells(5, 1).Value intNumberOfBodyCodes = 1 ' ******************************************************** ' Count The Number of Body Codes ' ******************************************************** For Each C In rngKeyRange If C.Value <> strLastBodyCode Then strLastBodyCode = C.Value intNumberOfBodyCodes = intNumberOfBodyCodes + 1 End If Next C ' ******************************************************** ' Create Sheets For All Body Codes ' ******************************************************** For i = 1 To intNumberOfBodyCodes - 1 Sheets("BodyCode").Copy After:=Sheets(i + 1) Next i wksMaster.Select ' ******************************************************** ' Copy The Data To the Body Code Sheets ' ******************************************************** strLastBodyCode = wksMaster.Cells(5, 1).Value lngStartingRow = 5 lngEndingRow = 0 intSheetToPopulate = 1 For Each C In rngKeyRange If C.Value <> strLastBodyCode Then lngEndingRow = C.Row - 1 intSheetToPopulate = intSheetToPopulate + 1 Range(wksMaster.Cells(lngStartingRow, 1), wksMaster.Cells(lngEndingRow, 55)).Copy Sheets(intSheetToPopulate).Cells(5, 1) Sheets(intSheetToPopulate).Name = strLastBodyCode lngStartingRow = C.Row strLastBodyCode = C.Value End If Next C ' ******************************************************** ' Do Last Iteration Copy ' ******************************************************** lngEndingRow = lngLastRowInMaster intSheetToPopulate = intSheetToPopulate + 1 Range(wksMaster.Cells(lngStartingRow, 1), wksMaster.Cells(lngEndingRow, 55)).Copy Sheets(intSheetToPopulate).Cells(5, 1) Sheets(intSheetToPopulate).Name = strLastBodyCode ' ******************************************************** ' Add Totals To Each Sheet ' ******************************************************** For i = 2 To Sheets.Count Sheets(i).Select ' ************************************************* ' Determine The Number Of Rows In The Worksheet ' ************************************************* lngNumberOfRowsInBodyCodeSheet = Sheets(i).Cells(Rows.Count, "A").End(xlUp).Row ' *************************************************************************** ' Set the Range Variable To The Location of Grand Totals For Numeric Columns ' This range is one row below the last number in the column(s) ' In the example below, we are summing columns 4 through 39 ' *************************************************************************** Set rngSubTotals = Range(Sheets(i).Cells(lngNumberOfRowsInBodyCodeSheet + 1, 4), Sheets(i).Cells(lngNumberOfRowsInBodyCodeSheet + 1, 55)) ' ************************************************************** ' Add the formula to compute the totals of all columns ' This worksheet has 4 header lines that are not summed ' ************************************************************** rngSubTotals.FormulaR1C1 = "=SUM(R[-" & lngNumberOfRowsInBodyCodeSheet - 4 & _ "]C:R[-1]C)" ' ************************************************************** ' Add Underlines to the Grand Totals Just Created ' ************************************************************** Set rngBorders = Range(Sheets(i).Cells(lngNumberOfRowsInBodyCodeSheet + 1, 4), Sheets(i).Cells(lngNumberOfRowsInBodyCodeSheet + 1, 55)) With rngBorders.Borders(xlEdgeTop) .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = xlAutomatic End With With rngBorders.Borders(xlEdgeBottom) .LineStyle = xlDouble .Weight = xlThick .ColorIndex = xlAutomatic End With lngTotalsRowNumber = lngNumberOfRowsInBodyCodeSheet + 1 ' ******************************************************** ' Autofit All The Columns Of The Current Sheet ' ******************************************************** Sheets(i).Cells.Columns.AutoFit Sheets(i).Cells(1, 1).Select Next i wksMaster.Select wksMaster.Cells(1, 1).Select ' ******************************************************** ' Turn On Screen Updating ' ******************************************************** Application.ScreenUpdating = True End Sub