1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | Sub CrossTabToList() 'written by Doctor Moxie Dim wsCrossTab As Worksheet Dim wsList As Worksheet Dim iLastCol AsLong Dim iLastRow AsLong Dim iLastRowList AsLong Dim rngCTab As Range 'Used for range in Sheet1 cross tab sheet Dim rngList As Range 'Destination range for the list Dim ROW AsLong Set wsCrossTab = Worksheets('Sheet1') 'AMEND TO SHOW SHEET NUMBER WITH THE CROSS TAB Set wsList = Worksheets.Add 'Find the last row in Sheet1 with the cross tab iLastRow = wsCrossTab.Cells(Rows.Count, 'A').End(xlUp).ROW 'Set the initial value for the row in the destination worksheet 'I set mine as 2 as I want to put headings in row 1 iLastRowList = 2 'Find the last column in Sheet1 with the cross tab iLastCol = wsCrossTab.Range('A2').End(xlToRight).Column 'Set the heading titles in the list sheet 'You will need to amend these to something appropriate for your sheet wsList.Range('A1:F1') = Array('NAME', 'PROJECT', 'TYPE', 'PLAN/ACTUAL', 'WEEK', 'HOURS') 'Start looping through the cross tab data For ROW = 3 To iLastRow 'START AT ROW 3 AS THIS IS WHERE DATA BEGINS IN MY CROSS TAB Set rngCTab = wsCrossTab.Range('A' & ROW, 'C' & ROW) 'initial value A3 SETS THE RANGE TO INCLUDE ALL STATIC DATA - IN THIS CASE NAME, PROJECT, TYPE Set rngList = wsList.Range('A' & iLastRowList) 'initial value A2 'Copy individual names in Col A (A3 initially) into as many rows as there are data columns 'in the cross tab (less 3 for Col A-C). rngCTab.Copy rngList.Resize(iLastCol - 3) 'SELECT THE HEADING ROW WITH FORECAST/ACTUAL 'Move up ROW (INITIALLY 3) rows less TWO and across 3 columns (using offset function). Copy. rngCTab.Offset(-(ROW - 2), 3).Resize(, iLastCol - 3).Copy 'Paste transpose to columns in the list sheet alongside the static data rngList.Offset(0, 3).PasteSpecial Transpose:=True 'SELECT THE ROW WITH THE WEEK NUMBERS 'Move up ROW (INITIALLY 3) rows less ONE and across 3 columns (using offset function). Copy. rngCTab.Offset(-(ROW - 1), 3).Resize(, iLastCol - 3).Copy 'Paste transpose to columns in the list sheet alongside the static data rngList.Offset(0, 4).PasteSpecial Transpose:=True 'Staying on same row (3 initially) copy the data from the cross tab rngCTab.Offset(, 3).Resize(, iLastCol - 3).Copy 'Past transpose as column in list sheet rngList.Offset(0, 5).PasteSpecial Transpose:=True 'Set the new last row in list sheet to be just below the last name copied iLastRowList = iLastRowList + (iLastCol - 3) 'increment ROW by 1 Next ROW EndSub |