1) if you want to copy/paste
Sub Getpiles()
Dim rng As Range, r As Range, myArea As Range, LastR As Range
Application.ScreenUpdating = False
Set rng = Sheets("current material").Cells(1).CurrentRegion
rng.Parent.AutoFilterMode = False
Set myArea = rng.Rows(1).SpecialCells(2, 2)
With Sheets("report")
.[a3].CurrentRegion.Clear
Set LastR = .[a3]
For Each r In myArea
If r <> "Errors" Then
rng.AutoFilter r.Column, "<>"
Union(rng.Offset(2).Columns("a:c"), rng.Offset(2).Columns(r.Column).Resize(, 4)).Copy LastR
rng.AutoFilter
Set LastR = .Range("a" & Rows.Count).End(xlUp)(2)
End If
Next
.[a3].CurrentRegion.Sort .[b3], 1, , .[c3], 1
End With
Application.ScreenUpdating = True
End Sub
2) Using array
Sub test()
Dim a, b, i As Long, ii As Long, iii As Long, n As Long
a = Sheets("current material").Cells(1).CurrentRegion.Value
ReDim b(1 To UBound(a, 1) * UBound(a, 2), 1 To 7)
With Sheets("report")
.[a3].CurrentRegion.ClearContents
For i = 3 To UBound(a, 1)
a(i, 1) = "'" & a(i, 1)
For ii = 4 To UBound(a, 2) Step 4
If a(i, ii) <> "" Then
n = n + 1
For iii = 1 To 3
b(n, iii) = a(i, iii)
Next
For iii = 4 To 7
b(n, iii) = a(i, ii + iii - 4)
Next
End If
Next
Next
.[a3].Resize(n, 7) = b
End With
End Sub
Bookmarks