This should do the trick :
Sub test_Ryan_Fung()
Dim WsSrc As Worksheet, _
WsRed As Worksheet, _
WsBlue As Worksheet, _
WsYellow As Worksheet, _
Ws As Worksheet, _
DateFilterRange As String, _
RandomRange As String, _
TotalRange As String, _
LastRow As Long, _
WriteRow As Long, _
ShArr(), _
Arr()
Set WsSrc = Sheet1
Set WsRed = Sheets("Red")
Set WsBlue = Sheets("Blue")
Set WsYellow = Sheets("Yellow")
ReDim ShArr(1 To 3)
Set ShArr(1) = WsRed: Set ShArr(2) = WsBlue: Set ShArr(3) = WsYellow
Application.CutCopyMode = False
On Error GoTo Err_Execute
With WsSrc
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
For i = 2 To LastRow
.Cells(i, 5) = Application.WorksheetFunction.RandBetween(1, 10000)
Next i
Arr = .Range("A2:E" & LastRow).Value
End With
For i = LBound(Arr, 1) To UBound(Arr, 1)
Select Case LCase(Arr(i, 4))
Case Is = "red"
With WsRed
WriteRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
For j = LBound(Arr, 2) To UBound(Arr, 2)
.Cells(WriteRow, j) = Arr(i, j)
Next j
End With
Case Is = "blue"
With WsBlue
WriteRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
For j = LBound(Arr, 2) To UBound(Arr, 2)
.Cells(WriteRow, j) = Arr(i, j)
Next j
End With
Case Is = "yellow"
With WsYellow
WriteRow = .Range("A" & .Rows.Count).End(xlUp).Row + 1
For j = LBound(Arr, 2) To UBound(Arr, 2)
.Cells(WriteRow, j) = Arr(i, j)
Next j
End With
Case Else
MsgBox "Color not recognised : " & Arr(i, 4), vbCritical + vbOKOnly
End Select
Next i
For i = LBound(ShArr, 1) To UBound(ShArr, 1)
Set Ws = ShArr(i)
With Ws
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
DateFilterRange = "C2:C" & LastRow
RandomRange = "E2:E" & LastRow
TotalRange = "A1:E" & LastRow
With .Sort
With .SortFields
.Clear
.Add Key:=Range(DateFilterRange), _
SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
.Add Key:=Range(RandomRange), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
End With
.SetRange Range(TotalRange)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
End With
Next i
Err_Execute:
If Err.Number = 0 Then
MsgBox "Transformation Done!"
Else
MsgBox Err.Description
End If
End Sub