Try:
Sub farrukh()
Application.ScreenUpdating = False
Dim desWS As Worksheet, srcWS As Worksheet
Set srcWS = ThisWorkbook.Sheets("MasterData")
Dim LastRow As Long, i As Long, header As Range, rng As Range, RngList As Object, item As Variant
Set RngList = CreateObject("Scripting.Dictionary")
For Each rng In srcWS.Range("B5", srcWS.Range("B" & srcWS.Rows.Count).End(xlUp))
If Not RngList.Exists(rng.Value) Then
RngList.Add rng.Value, Nothing
End If
Next rng
For Each item In RngList
LastRow = srcWS.Range("B" & srcWS.Rows.Count).End(xlUp).Row
Set desWS = Sheets(item)
srcWS.Range("A3:AE" & LastRow).AutoFilter Field:=2, Criteria1:=item
With srcWS.Range("A:A,B:B,Q:Q,U:U,W:W,AB:AB")
For i = 1 To .Areas.Count
x = .Areas(i).Column
Set header = desWS.Rows(3).Find(.Areas(i).Cells(3), LookIn:=xlValues, lookat:=xlWhole)
If Not header Is Nothing Then
srcWS.Range(srcWS.Cells(5, x), srcWS.Cells(LastRow, x)).SpecialCells(xlCellTypeVisible).Copy desWS.Cells(desWS.Rows.Count, header.Column).End(xlUp).Offset(1, 0)
If x > 2 Then
srcWS.Range(srcWS.Cells(5, x), srcWS.Cells(LastRow, x)).SpecialCells(xlCellTypeVisible).ClearContents
End If
End If
Next i
End With
LastRow = desWS.Range("B" & desWS.Rows.Count).End(xlUp).Row
desWS.Sort.SortFields.Clear
desWS.Sort.SortFields.Add Key:=Range("B4:B" & LastRow) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With desWS.Sort
.SetRange Range("A3:I" & LastRow)
.header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
srcWS.Range("A3").AutoFilter
Next item
Application.ScreenUpdating = True
End Sub
Bookmarks