Option Compare Text
Sub FindTestType()
'=============================================
' Find the test type for each ID and Date
'=============================================
Dim TData As Worksheet
Dim DataRow As Long
Dim ResultRow As Long
Dim LastDataRow As Long
Dim LastIDRow As Long
Dim ResultID As String
Dim PrevDataID As String
Dim NewDataID As String
Dim TestCountForThisDate As Integer
'===============================
' Turn off screen updating
'===============================
Application.ScreenUpdating = True
'===================================================
' Assign the variable to the worksheet TestData
'===================================================
Set TData = ActiveWorkbook.Sheets("TestData")
'=============================
' Delete previous results
'=============================
TData.Columns("E:AZ").EntireColumn.Delete
'============================
' Find the last data row
'============================
LastDataRow = TData.Range("A1048576").End(xlUp).Row
'=========================================
' Clear away any existing sort fields
'=========================================
TData.Sort.SortFields.Clear
'======================================
' Add the first sort field - Col A
'======================================
TData.Sort.SortFields.Add2 _
Key:=Range("A2:A" & LastDataRow), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
'=======================================
' Add the second sort field - Col B
'=======================================
TData.Sort.SortFields.Add2 _
Key:=Range("B2:B" & LastDataRow), _
SortOn:=xlSortOnValues, _
Order:=xlAscending, _
DataOption:=xlSortNormal
'======================
' Execute the Sort
'======================
With TData.Sort
.SetRange Range("A1:C" & LastDataRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'================================================
' Now that the data is sorted by ID and Date
' You will copy the ID to column E
' then remove the duplicate ID
'================================================
TData.Range("A1:A" & LastDataRow).Copy Destination:=TData.Range("E1")
'=======================
' Remove duplicates
'=======================
LastIDRow = TData.Range("E1048576").End(xlUp).Row
TData.Range("$E$1:$E" & LastIDRow).RemoveDuplicates _
Columns:=1, _
Header:=xlYes
'================================
' Insert the result headings
'================================
With TData
.Range("F1") = "Timepoint 1"
.Range("G1") = "A"
.Range("H1") = "B"
.Range("I1") = "Timepoint 2"
.Range("J1") = "A"
.Range("K1") = "B"
.Range("L1") = "Timepoint 3"
.Range("M1") = "A"
.Range("N1") = "B"
.Range("O1") = "Timepoint 4"
.Range("P1") = "A"
.Range("Q1") = "B"
.Range("R1") = "Timepoint 5"
.Range("S1") = "A"
.Range("T1") = "B"
.Range("U1") = "Timepoint 6"
.Range("V1") = "A"
.Range("W1") = "B"
.Range("X1") = "Timepoint 7"
.Range("Y1") = "A"
.Range("Z1") = "B"
.Range("AA1") = "Timepoint 8"
.Range("AB1") = "A"
.Range("AC1") = "B"
.Range("AD1") = "Timepoint 9"
.Range("AE1") = "A"
.Range("AF1") = "B"
.Range("AG1") = "Timepoint 10"
.Range("AH1") = "A"
.Range("AI1") = "B"
'ADD MORE IF NEEDED
'==================================
' Format the Timepoint columns
'==================================
.Columns("F:F").NumberFormat = "dd/mm/yyyy"
.Columns("I:I").NumberFormat = "dd/mm/yyyy"
.Columns("L:L").NumberFormat = "dd/mm/yyyy"
.Columns("O:O").NumberFormat = "dd/mm/yyyy"
.Columns("R:R").NumberFormat = "dd/mm/yyyy"
.Columns("U:U").NumberFormat = "dd/mm/yyyy"
.Columns("X:X").NumberFormat = "dd/mm/yyyy"
.Columns("AA:AA").NumberFormat = "dd/mm/yyyy"
.Columns("AD:AD").NumberFormat = "dd/mm/yyyy"
.Columns("AG:AG").NumberFormat = "dd/mm/yyyy"
'=================================
' Format the Test Type values
'=================================
.Columns("G:H").NumberFormat = "0"
.Columns("J:K").NumberFormat = "0"
.Columns("M:N").NumberFormat = "0"
.Columns("P:Q").NumberFormat = "0"
.Columns("S:T").NumberFormat = "0"
.Columns("V:W").NumberFormat = "0"
.Columns("Y:Z").NumberFormat = "0"
.Columns("AB:AC").NumberFormat = "0"
.Columns("AE:AF").NumberFormat = "0"
.Columns("AH:AI").NumberFormat = "0"
'=================================
' Data alignment in the cells
'=================================
.Columns("E:AZ").HorizontalAlignment = xlCenter
.Columns("E:AZ").VerticalAlignment = xlCenter
End With
'---------------------------------------------------------------------
' Next, we need a placeholder to identify the ID (on the results)
' Also, as we loop through the data
' we have to check whether the
' current ID (data) matches the current ID (results)
' so that we know to which row we copy the data
'---------------------------------------------------------------------
'=====================================
' Initialize (set initial values)
'=====================================
ResultRow = 2
DataRow = 2
PrevDataID = TData.Range("A" & ResultRow)
TestCountForThisDate = 0
'=================================
' Loop through the result IDs
'=================================
Do While TData.Range("E" & ResultRow) <> ""
'=============================
' Get the ID for this row
'=============================
ResultID = TData.Range("E" & ResultRow)
Debug.Print "ResultRow = " & ResultRow & " - ResultID = " & ResultID
'===========================
' Loop through the data
'===========================
Do While TData.Range("A" & DataRow) <> ""
'=====================
' Get the Data ID
'=====================
NewDataID = TData.Range("A" & DataRow)
Debug.Print " Data Row = " & DataRow & " - NewDataID = " & NewDataID
'==================================================================
' If the Data ID is the same as Result ID then copy the result
'==================================================================
If NewDataID = PrevDataID Then
'==================================
' Set the TestCountForThisDate
'==================================
TestCountForThisDate = TestCountForThisDate + 1
'===============================
' Copy the Data ID and Date
'===============================
Select Case TestCountForThisDate
Case 1
TData.Range("B" & DataRow).Copy TData.Range("F" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("G" & ResultRow) = TData.Range("G" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("H" & ResultRow) = TData.Range("H" & ResultRow) + 1
End If
Case 2
TData.Range("B" & DataRow).Copy TData.Range("I" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("J" & ResultRow) = TData.Range("J" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("K" & ResultRow) = TData.Range("K" & ResultRow) + 1
End If
Case 3
TData.Range("B" & DataRow).Copy TData.Range("L" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("M" & ResultRow) = TData.Range("M" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("N" & ResultRow) = TData.Range("N" & ResultRow) + 1
End If
Case 4
TData.Range("B" & DataRow).Copy TData.Range("O" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("P" & ResultRow) = TData.Range("P" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("Q" & ResultRow) = TData.Range("Q" & ResultRow) + 1
End If
Case 5
TData.Range("B" & DataRow).Copy TData.Range("R" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("S" & ResultRow) = TData.Range("S" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("T" & ResultRow) = TData.Range("T" & ResultRow) + 1
End If
Case 6
TData.Range("B" & DataRow).Copy TData.Range("U" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("V" & ResultRow) = TData.Range("V" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("W" & ResultRow) = TData.Range("W" & ResultRow) + 1
End If
Case 7
TData.Range("B" & DataRow).Copy TData.Range("X" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("Y" & ResultRow) = TData.Range("Y" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("Z" & ResultRow) = TData.Range("Z" & ResultRow) + 1
End If
Case 8
TData.Range("B" & DataRow).Copy TData.Range("AA" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("AB" & ResultRow) = TData.Range("AB" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("AC" & ResultRow) = TData.Range("AC" & ResultRow) + 1
End If
Case 9
TData.Range("B" & DataRow).Copy TData.Range("AD" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("AE" & ResultRow) = TData.Range("AE" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("AF" & ResultRow) = TData.Range("AF" & ResultRow) + 1
End If
Case 10
TData.Range("B" & DataRow).Copy TData.Range("AG" & ResultRow)
If TData.Range("C" & DataRow) = "A" Then
TData.Range("AH" & ResultRow) = TData.Range("AH" & ResultRow) + 1
ElseIf TData.Range("C" & DataRow) = "B" Then
TData.Range("AI" & ResultRow) = TData.Range("AI" & ResultRow) + 1
End If
'Add more if required
End Select
Else
'==========================================
' Different test ID, so exit this loop
'==========================================
TestCountForThisDate = 0
PrevDataID = NewDataID
Exit Do
End If
'===================
' Next Data Row
'===================
DataRow = DataRow + 1
Loop 'until no more data
'=====================
' Next Result Row
'=====================
ResultRow = ResultRow + 1
Loop 'until no more result ID
'=========================
' Autofit the columns
'=========================
TData.Columns("A:AZ").AutoFit
'===============================
' Turn back screen updating
'===============================
Application.ScreenUpdating = True
End Sub