{"text_format":"1","workbook":"xlsx","n_sheets":6,"sheets":["COVER","INPUTS & OUTPUTS","FORMULAS","_SORTER_TMPL","_XFER_TMPL","MACRO SETUP"],"not_rendered":{"charts":0,"images":0,"macros":1,"external_links":0,"defined_names":1,"comments":0,"pivot_tables":0},"unopened":[],"bounds":{"document_bytes":16777216,"sheet_cells":100000,"rows_first":2000,"rows_last":500,"rows_between":2000,"halvings":0,"cell_chars":16384,"cell_head_chars":4096},"cells_cut":0,"cells_raw":0,"read":"whole","date_system":"1900"}

{"sheet":"COVER","index":0,"n_rows":38,"n_cols":5,"rows_kept":38,"cut":false,"hidden":false,"merged":[[1,1,1,6],[7,1,7,6],[8,1,8,6],[5,1,5,6],[4,1,4,6],[3,1,3,6],[6,1,6,6],[2,1,2,6],[37,1,37,6],[33,1,33,6],[9,1,9,6],[27,1,27,6],[36,1,36,6],[29,1,29,6],[32,1,32,6],[34,1,34,6],[31,1,31,6],[25,1,25,6],[30,1,30,6],[26,1,26,6],[18,4,18,6],[10,3,16,6],[17,1,17,6],[28,1,28,6]]}
[]
[null,"CSE PACKAGE & CONVEYOR CALCULATOR"]
[null,"  Warehouse Automation Guy  |  Michael Collins  |  Conveyor Solutions Engineering"]
[]
[null,"  Built for engineers who move things for a living."]
[]
[]
[]
[]
[null,"  PROJECT INFORMATION"]
[null,"Project Name",null,"Notes Here"]
[null,"Project Number"]
[null,"Engineer"]
[null,"Company"]
[null,"Date Created"]
[]
[]
[null,"  REVISION HISTORY"]
[null,"REV","DATE","DESCRIPTION","AUTHOR"]
[]
[]
[]
[]
[]
[]
[]
[null,"  HOW TO USE THIS CALCULATOR"]
[null,"1.  Fill in Project Information above. Update revision history each time you save a new version."]
[null,"2.  Go to INPUTS & OUTPUTS tab. Enter carton sizes in the Carton Specs table — paste as many rows as needed."]
[null,"3.  Fill in Global Conveyor Inputs. These drive all calculations on all tabs."]
[null,"4.  All output cells (blue) calculate automatically. Never type in blue cells."]
[null,"5.  Click ADD SORTER to create a new sorter tab. Fill in sorter-specific inputs — carton data pulls automatically."]
[null,"6.  Click ADD TRANSFER to create a new 90° transfer tab. BF and OAW pull from main sheet as defaults."]
[null,"7.  See FORMULAS tab for plain-english explanations of every calculation."]
[null,"8.  Amber = INPUT.   Blue = OUTPUT.   Green = PASS.   Red = FAIL."]
[]
[]
[null,"© Warehouse Automation Guy  |  Michael Collins  |  Not for redistribution without permission"]

{"sheet":"INPUTS & OUTPUTS","index":1,"n_rows":42,"n_cols":10,"rows_kept":42,"cut":false,"hidden":false,"merged":[[10,15,10,18],[10,3,10,5],[6,0,6,10],[4,5,4,6],[26,3,26,7],[8,3,8,5],[7,3,7,5],[5,4,5,7],[4,7,4,8],[36,0,36,10],[16,1,16,8],[17,0,17,10],[39,3,39,9],[11,0,11,10],[18,0,18,10],[27,0,27,10],[12,0,12,10],[25,3,25,7],[33,0,33,10],[32,5,32,9],[31,5,31,9],[2,0,2,10],[35,3,35,9],[5,0,5,3],[1,0,1,10],[41,0,41,10],[30,5,30,9],[5,8,5,10],[9,3,9,5],[34,0,34,10],[3,0,3,10],[38,5,38,9],[19,0,19,10],[28,0,28,10],[4,1,4,2],[4,3,4,4],[37,0,37,10]]}
[]
["CSE PACKAGE & CONVEYOR CALCULATOR  |  Warehouse Automation Guy"]
["Amber = INPUT  |  Blue = OUTPUT  |  Do not type in blue cells  |  Michael Collins  |  Conveyor Solutions Engineering"]
[]
[null,"  AMBER = INPUT",null,"  BLUE = OUTPUT",null,"  GREEN = PASS",null,"  RED = FAIL"]
[null,null,null,null,null,null,null,null,"  See MACRO SETUP tab for instructions"]
["  1  |  GLOBAL CONVEYOR INPUTS"]
[null,"Speed In (FPM)",60,"Main line inbound speed",null,null,null,"Roller Centers (in)",3,"Standard: 3 in"]
[null,"Speed Out (FPM)",120,"Main line outbound speed",null,null,null,"Between Rail / BF (in)",21,"Conveyor between-frame width"]
[null,"Starting Gap (in)",24,"Gap at induct / start of system",null,null,null,"OAW (in)",24,"Overall width — for transfer and skew calcs"]
[null,"Inside Curve Radius (in)",34.5,"From manufacturer catalog — round UP to next BF after calc"]
[]
["  2  |  CARTON SPECIFICATIONS  —  paste carton data here, table auto-expands on Tab"]
[null,"CARTON ID","L (in)","W (in)","H (in)","WT (lbs)","WT/FT (lbs/ft)","MIN CURVE BF (in)","TUMBLE ANGLE (deg)"]
[null,"Min",9,6,3,0.1,{"$f":"IFERROR(F15/(C15/12),\"\")","v":0.13333333333333333},{"$f":"IFERROR(SQRT((C11+D15)*(C11+D15)+(C15/2)*(C15/2))-(C11-2),\"\")","v":8.2492331216183743},{"$f":"IFERROR(ATAN(C15/(3*E15))*180/PI(),\"\")","v":45}]
[null,"Max",20,15,10,50,{"$f":"IFERROR(F16/(C16/12),\"\")","v":30},{"$f":"IFERROR(SQRT((C11+D16)*(C11+D16)+(C16/2)*(C16/2))-(C11-2),\"\")","v":18},{"$f":"IFERROR(ATAN(C16/(3*E16))*180/PI(),\"\")","v":33.690067525979785}]
[null,"  Insert Row To Add. Per-carton outputs (WT/FT, curve BF, tumble angle) auto-calculate."]
[]
["  3  |  CALCULATED RESULTS"]
["  CARTON SIZE & WEIGHT SUMMARY"]
[null,null,"MIN","MAX","AVG"]
[null,"LENGTH (in)",{"$f":"IFERROR(MIN(CartonSpecs[L (in)]),\"\")","v":9},{"$f":"IFERROR(MAX(CartonSpecs[L (in)]),\"\")","v":20},{"$f":"IFERROR(AVERAGE(CartonSpecs[L (in)]),\"\")","v":14.5}]
[null,"WIDTH (in)",{"$f":"IFERROR(MIN(CartonSpecs[W (in)]),\"\")","v":6},{"$f":"IFERROR(MAX(CartonSpecs[W (in)]),\"\")","v":15},{"$f":"IFERROR(AVERAGE(CartonSpecs[W (in)]),\"\")","v":10.5}]
[null,"HEIGHT (in)",{"$f":"IFERROR(MIN(CartonSpecs[H (in)]),\"\")","v":3},{"$f":"IFERROR(MAX(CartonSpecs[H (in)]),\"\")","v":10},{"$f":"IFERROR(AVERAGE(CartonSpecs[H (in)]),\"\")","v":6.5}]
[null,"WEIGHT (lbs)",{"$f":"IFERROR(MIN(CartonSpecs[WT (lbs)]),\"\")","v":0.1},{"$f":"IFERROR(MAX(CartonSpecs[WT (lbs)]),\"\")","v":50},{"$f":"IFERROR(AVERAGE(CartonSpecs[WT (lbs)]),\"\")","v":25.05}]
[null,"MIN TUMBLE ANGLE — worst case incline limit (°)",{"$f":"IFERROR(MIN(CartonSpecs[TUMBLE ANGLE (deg)]),\"\")","v":33.690067525979785},"Worst case carton sets the incline limit — if this angle is unacceptable, find the outlier carton in the table above"]
[null,"MAX CURVE BF REQUIRED (in)",{"$f":"IFERROR(MAX(CartonSpecs[MIN CURVE BF (in)]),\"\")","v":18},"Round UP to next catalog BF — requires Inside Curve Radius input above — add guard thickness for chain/belt curves"]
[]
["  PRODUCT GAP, THEORETICAL RATE & PITCH"]
[null,null,"MIN","MAX","AVG"]
[null,"GAP PRODUCED (in)",{"$f":"IFERROR(C9*(C22/C8)-C22+C10,\"\")","v":33},{"$f":"IFERROR(C9*(D22/C8)-D22+C10,\"\")","v":44},{"$f":"IFERROR(C9*(E22/C8)-E22+C10,\"\")","v":38.5},"Gap between packages at Speed Out — based on min, max, avg carton length"]
[null,"THEORETICAL RATE (CPM)",{"$f":"IFERROR(C8/((D22+C10)/12),\"\")","v":16.363636363636363},{"$f":"IFERROR(C8/((C22+C10)/12),\"\")","v":21.818181818181817},{"$f":"IFERROR(C8/((E22+C10)/12),\"\")","v":18.7012987012987},"CPM — MAX pkg gives slowest (design) rate. MIN pkg gives fastest possible rate."]
[null,"PITCH (in)  Leading to Leading  Edge  Spacing",{"$f":"IFERROR(C31+C22,\"\")","v":42},{"$f":"IFERROR(D31+D22,\"\")","v":64},{"$f":"IFERROR(E31+E22,\"\")","v":53},"in - gap plus package length"]
[]
["  SKEW CONVEYOR REQUIRED LENGTH"]
[null,"SKEW LENGTH REQUIRED (ft)",{"$f":"IFERROR(((I9-C23)*I9/I8+D22)/12,\"\")","v":10.416666666666666},"ft — narrowest carton must traverse full BF. Longest carton must be contained during traverse. Assumes longest length."]
[]
["  SCAN / LOOKUP TIME UTILITY"]
[null,"Belt Speed (FPM)",120,"Distance (in)",120,"Enter any speed and distance — time calculates automatically"]
[null,"TIME BETWEEN POINTS (seconds)",{"$f":"IFERROR((E39/12)/(C39/60),\"\")","v":5},"seconds -  time for product to travel from one point to another"]
[]
["  © Warehouse Automation Guy  |  Michael Collins  |  CSE Master Calculator"]

{"sheet":"FORMULAS","index":2,"n_rows":18,"n_cols":5,"rows_kept":18,"cut":false,"hidden":false,"merged":[[0,0,0,5],[1,0,1,5]]}
["  FORMULA REFERENCE  —  read only  |  Warehouse Automation Guy"]
[]
[null,"CALCULATION","PLAIN ENGLISH","FORMULA","SOURCE CALCULATOR"]
[null,"Weight per Foot (lbs/ft)","Package weight divided by its length converted to feet","WT / (L / 12)","PACKAGE_CALCS_r3_.xltx"]
[null,"Min Curve BF (in)","Minimum between-frame width for a curve given inside radius, package width and length","SQRT((IR + W)² + (L/2)²) − (IR − 2)","Minimum_Curve_BR.xlsx / Curve_Formula.xlsx"]
[null,"Tumble Angle (°)","Maximum safe incline before the carton tips — design to the worst case (minimum) across all cartons","ATAN(L / (3 × H)) × 180 / PI","Box_Tumbling.xlsx"]
[null,"Gap Produced (in)","Gap between packages at Speed Out, accounting for speed ratio and starting gap","SpeedOut × (L / SpeedIn) − L + StartingGap","PACKAGE_CALCS_r3_.xltx"]
[null,"Theoretical Rate (CPM)","Maximum throughput achievable at a given speed and gap — use max package length for design rate","SpeedIn / ((L + StartingGap) / 12)","PACKAGE_CALCS_r3_.xltx"]
[null,"Pitch (in)","Center to center distance between packages","Gap + L","PACKAGE_CALCS_r3_.xltx"]
[null,"Skew Length (ft)","Conveyor length needed for narrowest carton to traverse full BF — longest carton sets minimum containment length","((BF − MinW) × BF / RollerCenters + MaxL) / 12","Skewed_Roller.xlsx"]
[null,"Lookup Time (sec)","Time for product to travel a given distance at a given belt speed","(Distance / 12) / (Speed / 60)","PACKAGE_CALCS_r3_.xltx"]
[null,"SORTER — CFPM","Minimum conveyor speed needed to achieve required throughput rate — rate drives speed","(AvgLength × Rate CPM) / 12","Case_Feet_Per_Minute.xlsx"]
[null,"SORTER — Gap Produced (in)","Actual gap between cartons at sorter speed and required rate","(SorterSpeed × 12 / Rate) − AvgLength","PACKAGE_CALCS_r3_.xltx"]
[null,"SORTER — Gap Required by Geometry (in)","Minimum gap needed for the sorter to physically divert the widest carton without hitting the next one","(MaxWidth × SIN(divert angle)) + 2","Gap_Requirement.xlsx"]
[null,"SORTER — Takeaway Spur Speed (FPM)","Required speed of the takeaway spur belt to match product velocity at the divert angle","SorterSpeed / COS(divert angle)","Speed_of_Take_Away_Spur.xlsx"]
[null,"TRANSFER — Lateral Distance (in)","Distance the carton must travel sideways to fully clear the conveyor — worst case carton position","BF + ((OAW − BF) / 2)","New — 90° Transfer Calc"]
[null,"TRANSFER — Cycle Time (sec)","Total time the transfer is busy — lift, lateral travel, lower — trunk line cannot deliver next carton during this window","LiftTime + (LateralDist / 12) / (TransferSpeed / 60) + LowerTime","New — 90° Transfer Calc"]
[null,"TRANSFER — Min Gap Required (in)","Minimum gap needed on trunk line for transfer to complete full cycle before next carton arrives — includes 4in safety margin","(CycleTime × TrunkSpeed / 5) + 4","New — 90° Transfer Calc"]

{"sheet":"_SORTER_TMPL","index":3,"n_rows":28,"n_cols":6,"rows_kept":28,"cut":false,"hidden":true,"merged":[[27,0,27,6],[2,0,2,4],[10,0,10,1],[18,0,18,1],[24,0,24,4],[24,5,24,6],[0,0,0,6],[1,0,1,6],[3,0,3,6],[10,5,10,6],[18,5,18,6]]}
["  SORTER — [NAME]  |  Warehouse Automation Guy  |  CSE Package Calculator"]
["  Carton data and BF pull automatically from INPUTS & OUTPUTS tab. Fill in amber cells."]
[]
["  SORTER INPUTS"]
[null,"Sorter Name / ID",null,null,null,"Used to label this tab"]
[null,"Sorter Model","ProSort 121",null,null,"Select from dropdown  - sets manufacturer minimum gap"]
[null,"Required Rate (CPM)",null,null,null,"Customer throughput requirement  - this drives everything"]
[null,"Divert Angle (°)",30,null,null,"Typically 30°. Also common: 22°"]
[null,"Safety Factor",1.1499999999999999,null,null,"Applied to CFPM  - 1.15 standard per Hytrol spec. Can reduce at higher speeds."]
[null,"Gap at Sorter Induct (in)",{"$f":"IFERROR('INPUTS & OUTPUTS'!C31,\"\")","v":33},null,null,"Defaults from main sheet min-pkg gap produced. Override if different."]
["  SORTER OUTPUTS",null,"MIN PKG","MAX PKG","AVG PKG","NOTE"]
[null,"CFPM — Min Conveyor Speed (FPM)",{"$f":"IFERROR(('INPUTS & OUTPUTS'!C22*C7/12)*C9,\"\")","v":0},{"$f":"IFERROR(('INPUTS & OUTPUTS'!D22*C7/12)*C9,\"\")","v":0},{"$f":"IFERROR(('INPUTS & OUTPUTS'!E22*C7/12)*C9,\"\")","v":0},"(L × Rate / 12) × Safety Factor — MAX pkg is design speed"]
[null,"SGR — Speed Gap Ratio",{"$f":"IFERROR(('INPUTS & OUTPUTS'!C22+C10)/'INPUTS & OUTPUTS'!C22,\"\")","v":4.666666666666667},{"$f":"IFERROR(('INPUTS & OUTPUTS'!D22+C10)/'INPUTS & OUTPUTS'!D22,\"\")","v":2.65},{"$f":"IFERROR(('INPUTS & OUTPUTS'!E22+C10)/'INPUTS & OUTPUTS'!E22,\"\")","v":3.2758620689655173},"(L + Gap at Induct) / L -  MIN pkg = highest SGR = worst case"]
[null,"REQUIRED SORTER SPEED (FPM)",{"$f":"IFERROR(C13*C12,\"\")","v":0},{"$f":"IFERROR(D13*D12,\"\")","v":0},{"$f":"IFERROR(E13*E12,\"\")","v":0},"SGR × CFPM - MAX col is your design speed"]
[null,"GAP PRODUCED at Sorter Speed (in)",{"$f":"IFERROR((C14*12/C7)-'INPUTS & OUTPUTS'!C22,\"\")","v":""},{"$f":"IFERROR((D14*12/C7)-'INPUTS & OUTPUTS'!D22,\"\")","v":""},{"$f":"IFERROR((E14*12/C7)-'INPUTS & OUTPUTS'!E22,\"\")","v":""},"(Speed × 12 / Rate) − L"]
[null,"SORTER MODEL MIN GAP (in)",{"$f":"IFERROR(IF(C6=\"ProSort SC\",12,IF(C6=\"ProSort 121\",IF('INPUTS & OUTPUTS'!D23<8,6,IF('INPUTS & OUTPUTS'!D23<16,9,IF('INPUTS & OUTPUTS'!D23<24,12,15))),IF(C6=\"ProSort 131\",IF('INPUTS & OUTPUTS'!D23<6,6,IF('INPUTS & OUTPUTS'!D23<12,9,IF('INPUTS & OUTPUTS'!D23<18,12,15))),IF(C6=\"ProSort 421\",IF('INPUTS & OUTPUTS'!D23<13,10,IF('INPUTS & OUTPUTS'!D23<26,16,20)),IF(C6=\"ProSort 431\",IF('INPUTS & OUTPUTS'!D23<10,10,IF('INPUTS & OUTPUTS'!D23<20,16,IF('INPUTS & OUTPUTS'!D23<30,20,26))),IF(C6=\"QS-1\",12,IF(C6=\"QS-2\",18,\"\"))))))),\"Select model\")","v":9},"← uses Max W",null,"Width-based per Hytrol spec card — uses widest carton"]
[null,"GAP REQUIRED — Geometry (in)",{"$f":"IFERROR(('INPUTS & OUTPUTS'!D23*SIN(RADIANS(C8)))+2,\"\")","v":9.5},"← uses Max W",null,"(Max W × SIN(angle)) + 2"]
[null,"TAKEAWAY SPUR SPEED (FPM)",{"$f":"IFERROR(C14/COS(RADIANS(C8)),\"\")","v":0},{"$f":"IFERROR(D14/COS(RADIANS(C8)),\"\")","v":0},{"$f":"IFERROR(E14/COS(RADIANS(C8)),\"\")","v":0}]
["  GAP & SPEED CHECKS",null,"MIN PKG","MAX PKG","AVG PKG","NOTE"]
[null,"Gap Produced vs Model Min Gap",{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},"Gap produced vs model minimum  -MIN pkg is binding"]
[null,"Gap Produced vs Geometric Requirement",{"$f":"IFERROR(IF(C10>=C17,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C17,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C17,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},"Gap produced vs geometric clearance"]
[null,"Gap at Induct vs Model Min Gap",{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},"Induct gap must meet model minimum"]
[null,"Gap at Induct vs Geometric Requirement",{"$f":"IFERROR(IF(C10>=C17,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C17,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},{"$f":"IFERROR(IF(C10>=C17,\"PASS\",\"FAIL\"),\"—\")","v":"PASS"},"Induct gap vs geometric clearance"]
[]
["  LOOKUP TIME UTILITY  —  uses MAX sorter speed",null,null,null,null,"NOTE"]
[null,"Distance Between Points (in)"]
[null,"TIME BETWEEN POINTS (seconds)",{"$f":"IFERROR((C26/12)/(D14/60),\"\")","v":""},null,null,"seconds -  uses MAX sorter speed"]
["  © Warehouse Automation Guy  |  Michael Collins"]

{"sheet":"_XFER_TMPL","index":4,"n_rows":25,"n_cols":4,"rows_kept":25,"cut":false,"hidden":true,"merged":[[1,0,1,4],[0,0,0,4],[16,0,16,4],[17,0,17,4],[24,0,24,4],[2,0,2,4],[12,0,12,4],[20,0,20,4],[3,0,3,4],[19,0,19,4]]}
["  90° TRANSFER - [NAME]  |  Warehouse Automation Guy  |  CSE Package Calculator"]
["  BF and OAW default from INPUTS & OUTPUTS tab. Override here if this transfer is on a different conveyor width."]
[]
["  TRANSFER INPUTS"]
[null,"Transfer Name / ID",null,"Used to label this tab"]
[null,"Trunk Line Speed (FPM)",null,"Main conveyor speed feeding this transfer"]
[null,"Transfer Lateral Speed (FPM)",null,"Speed of transfer mechanism moving carton sideways"]
[null,"OAW (in)",{"$f":"'INPUTS & OUTPUTS'!I10","v":24},"Defaults from main sheet (I10) - override if different"]
[null,"BF (in)",{"$f":"'INPUTS & OUTPUTS'!I9","v":21},"Defaults from main sheet (I9) - override if different"]
[null,"Starting Gap (in)",{"$f":"IFERROR('INPUTS & OUTPUTS'!C31,\"\")","v":33},"Defaults from main sheet min-pkg gap produced. Override if different."]
[null,"Lift Time (sec)",0.5,"Default 0.5 sec - adjust for specific transfer model"]
[null,"Lower Time (sec)",0.5,"Default 0.5 sec - adjust for specific transfer model"]
["  TRANSFER OUTPUTS"]
[null,"LATERAL TRAVEL DISTANCE (in)",{"$f":"IFERROR(C9+((C8-C9)/2),\"\")","v":22.5},"BF + half side frame - worst case carton position opposite divert side"]
[null,"TRANSFER CYCLE TIME (sec)",{"$f":"IFERROR(C11+(C14/12)/(C7/60)+C12,\"\")","v":""},"Lift + lateral travel + lower"]
[null,"MIN GAP REQUIRED ON TRUNK LINE (in)",{"$f":"IFERROR((C15*C6/5)+4,\"\")","v":""},"(Cycle time × trunk speed / 5) + 4 in buffer"]
[]
["  TRANSFER CHECK"]
[null,"Gap Available vs Min Gap Required",{"$f":"IFERROR(IF(C10>=C16,\"PASS\",\"FAIL\"),\"Enter inputs\")","v":"FAIL"},"FAIL = carton collision - increase gap or slow trunk speed"]
[]
["  LOOKUP TIME UTILITY  -  uses trunk line speed"]
[null,"Distance Between Points (in)"]
[null,"TIME BETWEEN POINTS (seconds)",{"$f":"IFERROR((C22/12)/(C6/60),\"\")","v":""},"seconds - uses trunk line speed as reference"]
[]
["  © Warehouse Automation Guy  |  Michael Collins"]

{"sheet":"MACRO SETUP","index":5,"n_rows":120,"n_cols":3,"rows_kept":120,"cut":false,"hidden":false,"merged":[[0,0,0,3],[7,0,7,3],[119,0,119,3],[118,0,118,3],[2,0,2,3],[14,0,14,3],[6,0,6,3],[15,0,15,3]]}
["  MACRO SETUP  —  one-time setup to enable Add Sorter and Add Transfer buttons"]
[]
["  STEP 1 — Enable Macros"]
[null,"  1.","When you open this file, click 'Enable Content' / 'Enable Macros' in the yellow security bar at the top."]
[null,"  2.","If you don't see that bar: File → Options → Trust Center → Trust Center Settings → Macro Settings → Enable all macros"]
[null,"  3.","Save the file as .xlsm (macro-enabled workbook) if prompted."]
[]
["  STEP 2 — Paste the VBA Code (one time only)"]
[null,"  1.","Press Alt + F11 to open the Visual Basic Editor."]
[null,"  2.","In the left panel, find your workbook (e.g. 'VBAProject (Product Spec Calc r4.0 )."]
[null,"  3.","Right-click on it → Insert → Module"]
[null,"  4.","Copy ALL the code from the green box below and paste it into the new module."]
[null,"  5.","Press Ctrl + S to save. Close the VBA editor (Alt + F11 again)."]
[null,"  6.","Done. The ADD SORTER and ADD TRANSFER buttons on the INPUTS & OUTPUTS tab will now work."]
[]
["  VBA CODE — copy everything below this line"]
[null,null,"Sub AddSorter()"]
[null,null,"    Dim ws As Worksheet, tmpl As Worksheet"]
[null,null,"    Dim newName As String, tabName As String"]
[null,null,"    newName = InputBox(\"Enter sorter name:\", \"Add Sorter\", \"Sorter \" & CountSheetsByPrefix(\"S - \") + 1)"]
[null,null,"    If Trim(newName) = \"\" Then Exit Sub"]
[null,null,"    tabName = \"S - \" & Left(CleanTabName(newName), 27)"]
[null,null,"    If SheetExists(tabName) Then MsgBox \"Tab already exists.\", vbExclamation: Exit Sub"]
[null,null,"    If Not SheetExists(\"_SORTER_TMPL\") Then MsgBox \"_SORTER_TMPL tab not found.\", vbCritical: Exit Sub"]
[null,null,"    Set tmpl = ThisWorkbook.Sheets(\"_SORTER_TMPL\")"]
[null,null,"    tmpl.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.count)"]
[null,null,"    Set ws = ThisWorkbook.Sheets(ThisWorkbook.Sheets.count)"]
[null,null,"    ws.name = tabName"]
[null,null,"    ws.Visible = xlSheetVisible"]
[null,null,"    ws.Tab.Color = RGB(240, 196, 25)"]
[null,null,"    ws.Cells(1, 1).Value = \"  SORTER - \" & UCase(newName) & \"  |  Warehouse Automation Guy  |  CSE Package Calculator\""]
[null,null,"    ws.Cells(LabelRow(ws, \"Sorter Name / ID\"), 3).Value = newName"]
[null,null,"    ws.Activate"]
[null,null,"    MsgBox \"Sorter tab created!\" & Chr(10) & Chr(10) & \"1. Select Sorter Model\" & Chr(10) & \"2. Enter Required Rate (CPM)\" & Chr(10) & \"3. Review calculated sorter speed\", vbInformation, \"Done\""]
[null,null,"End Sub"]
[]
[null,null,"Sub AddTransfer()"]
[null,null,"    Dim ws As Worksheet, tmpl As Worksheet"]
[null,null,"    Dim newName As String, tabName As String"]
[null,null,"    newName = InputBox(\"Enter transfer name:\", \"Add 90 Transfer\", \"Transfer \" & CountSheetsByPrefix(\"T - \") + 1)"]
[null,null,"    If Trim(newName) = \"\" Then Exit Sub"]
[null,null,"    tabName = \"T - \" & Left(CleanTabName(newName), 27)"]
[null,null,"    If SheetExists(tabName) Then MsgBox \"Tab already exists.\", vbExclamation: Exit Sub"]
[null,null,"    If Not SheetExists(\"_XFER_TMPL\") Then MsgBox \"_XFER_TMPL tab not found.\", vbCritical: Exit Sub"]
[null,null,"    Set tmpl = ThisWorkbook.Sheets(\"_XFER_TMPL\")"]
[null,null,"    tmpl.Copy After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.count)"]
[null,null,"    Set ws = ThisWorkbook.Sheets(ThisWorkbook.Sheets.count)"]
[null,null,"    ws.name = tabName"]
[null,null,"    ws.Visible = xlSheetVisible"]
[null,null,"    ws.Tab.Color = RGB(220, 230, 241)"]
[null,null,"    ws.Cells(1, 1).Value = \"  90 DEGREE TRANSFER - \" & UCase(newName) & \"  |  Warehouse Automation Guy  |  CSE Package Calculator\""]
[null,null,"    ws.Cells(LabelRow(ws, \"Transfer Name / ID\"), 3).Value = newName"]
[null,null,"    ws.Activate"]
[null,null,"    MsgBox \"Transfer tab created!\" & Chr(10) & \"Starting Gap, OAW and BF defaulted from main sheet.\" & Chr(10) & \"Fill in Trunk Speed and Lateral Speed.\", vbInformation, \"Done\""]
[null,null,"End Sub"]
[]
[null,null,"Function CleanTabName(s As String) As String"]
[null,null,"    Dim result As String, i As Integer"]
[null,null,"    result = s"]
[null,null,"    For i = 1 To Len(\"/\\?*[]\")"]
[null,null,"        result = Replace(result, Mid(\"/\\?*[]\", i, 1), \"-\")"]
[null,null,"    Next i"]
[null,null,"    CleanTabName = result"]
[null,null,"End Function"]
[]
[null,null,"Function SheetExists(name As String) As Boolean"]
[null,null,"    Dim ws As Worksheet"]
[null,null,"    For Each ws In ThisWorkbook.Sheets"]
[null,null,"        If ws.name = name Then SheetExists = True: Exit Function"]
[null,null,"    Next ws"]
[null,null,"    SheetExists = False"]
[null,null,"End Function"]
[]
[null,null,"Function CountSheetsByPrefix(prefix As String) As Integer"]
[null,null,"    Dim ws As Worksheet, count As Integer"]
[null,null,"    For Each ws In ThisWorkbook.Sheets"]
[null,null,"        If Left(ws.name, Len(prefix)) = prefix Then count = count + 1"]
[null,null,"    Next ws"]
[null,null,"    CountSheetsByPrefix = count"]
[null,null,"End Function"]
[]
[null,null,"Function LabelRow(ws As Worksheet, label As String) As Long"]
[null,null,"    Dim r As Long"]
[null,null,"    For r = 1 To 50"]
[null,null,"        If Trim(CStr(ws.Cells(r, 2).Value)) = Trim(label) Then"]
[null,null,"            LabelRow = r: Exit Function"]
[null,null,"        End If"]
[null,null,"    Next r"]
[null,null,"    LabelRow = 0"]
[null,null,"End Function"]
[null,null,"    CleanName = result"]
[null,null,"End Function"]
[]
[null,null,"Function SheetExists(name As String) As Boolean"]
[null,null,"    Dim ws As Worksheet"]
[null,null,"    For Each ws In ThisWorkbook.Sheets"]
[null,null,"        If ws.Name = name Then SheetExists = True: Exit Function"]
[null,null,"    Next ws"]
[null,null,"    SheetExists = False"]
[null,null,"End Function"]
[]
[null,null,"Function CountSheetsByPrefix(prefix As String) As Integer"]
[null,null,"    Dim ws As Worksheet, count As Integer"]
[null,null,"    For Each ws In ThisWorkbook.Sheets"]
[null,null,"        If Left(ws.Name, Len(prefix)) = prefix Then count = count + 1"]
[null,null,"    Next ws"]
[null,null,"    CountSheetsByPrefix = count"]
[null,null,"End Function"]
[]
[null,null,"Function LabelRow(ws As Worksheet, label As String) As Long"]
[null,null,"    Dim r As Long"]
[null,null,"    For r = 1 To 40"]
[null,null,"        If InStr(1, CStr(ws.Cells(r, 2).Value), label, vbTextCompare) > 0 Then"]
[null,null,"            LabelRow = r: Exit Function"]
[null,null,"        End If"]
[null,null,"    Next r"]
[null,null,"    LabelRow = 5"]
[null,null,"End Function"]
[]
["  © Warehouse Automation Guy  |  Michael Collins  |  This code is proprietary. Do not redistribute."]