Sub Test()
Dim shData As Worksheet
Dim arr As Variant, lngRow As Long
Dim lngMin As Long, lngMax As Long, lngPeriod As Long
Dim strPeriod() As String, lngIndex As Long
Dim strTemp As String, strSplitTemp() As String
Dim strA As String, strSplitA() As String
Dim strB As String, strSplitB() As String
Dim strC As String, strSplitC() As String
Dim strD As String, strSplitD() As String
Dim strE As String, strSplitE() As String
Dim strResult() As Variant
Dim lngID1 As Long, lngID2 As Long, lngID3 As Long, lngID4 As Long, lngID5 As Long
Set shData = Sheets("Sheet1")
lngRow = shData.Range("A" & Rows.Count).End(xlUp).Row
arr = shData.Range("A2:C" & lngRow)
lngMin = Application.WorksheetFunction.Min(Application.WorksheetFunction.Index(arr, 0, 3))
lngMax = Application.WorksheetFunction.Max(Application.WorksheetFunction.Index(arr, 0, 3))
ReDim strPeriod(lngMin To lngMax)
ReDim strResult(1 To 7, 1 To 1)
For lngRow = LBound(arr) To UBound(arr)
lngPeriod = arr(lngRow, 3)
strPeriod(lngPeriod) = strPeriod(lngPeriod) & "," & arr(lngRow, 2)
Next
lngIndex = 0
For lngRow = LBound(strPeriod) To UBound(strPeriod)
strA = "": strB = "": strC = "": strD = "": strE = ""
If strPeriod(lngRow) <> "" Then
strSplitTemp = Split(strPeriod(lngRow), ",")
For lngID1 = 1 To UBound(strSplitTemp)
strTemp = Mid(strSplitTemp(lngID1), 1, 1)
Select Case UCase(strTemp)
Case "A"
strA = strA & "," & strSplitTemp(lngID1)
Case "B"
strB = strB & "," & strSplitTemp(lngID1)
Case "C"
strC = strC & "," & strSplitTemp(lngID1)
Case "D"
strD = strD & "," & strSplitTemp(lngID1)
Case "E"
strE = strE & "," & strSplitTemp(lngID1)
End Select
Next
If strA = "" Then strSplitA = Split(",", ",") Else strSplitA = Split(strA, ",")
If strB = "" Then strSplitB = Split(",", ",") Else strSplitB = Split(strB, ",")
If strC = "" Then strSplitC = Split(",", ",") Else strSplitC = Split(strC, ",")
If strD = "" Then strSplitD = Split(",", ",") Else strSplitD = Split(strD, ",")
If strE = "" Then strSplitE = Split(",", ",") Else strSplitE = Split(strE, ",")
For lngID1 = 1 To UBound(strSplitA)
For lngID2 = 1 To UBound(strSplitB)
For lngID3 = 1 To UBound(strSplitC)
For lngID4 = 1 To UBound(strSplitD)
For lngID5 = 1 To UBound(strSplitE)
lngIndex = lngIndex + 1
ReDim Preserve strResult(1 To 7, 1 To lngIndex)
strResult(1, lngIndex) = lngIndex
strResult(2, lngIndex) = strSplitA(lngID1)
strResult(3, lngIndex) = strSplitB(lngID2)
strResult(4, lngIndex) = strSplitC(lngID3)
strResult(5, lngIndex) = strSplitD(lngID4)
strResult(6, lngIndex) = strSplitE(lngID5)
strResult(7, lngIndex) = lngRow
Next
Next
Next
Next
Next
End If
Next
strResult = Application.WorksheetFunction.Transpose(strResult)
shData.Range("F2").Resize(UBound(strResult), 7) = strResult
End Sub