Sub GPE()
Dim Darr(), Arr(), Dic As Object, i As Long, R As Long, k As Long, j As Long
Set Dic = CreateObject("scripting.dictionary")
R = Sheets("BOM").Range("A4").End(xlDown).Row - 1
Darr = Sheets("BOM").Range("A2:FD" & R + 1).Value
ReDim Arr(1 To (UBound(Darr, 2) - 4) * R, 1 To 5)
k = 1
For j = 5 To UBound(Darr, 2)
If Darr(R, j) > 0 Then
Arr(k, 1) = Darr(1, j)
For i = 3 To R - 1
If Darr(i, j) > 0 Then
Arr(k, 2) = Darr(i, 1): Arr(k, 3) = Darr(i, 2)
Arr(k, 4) = Darr(i, 3): Arr(k, 5) = Darr(i, j)
k = k + 1
End If
Next i
End If
Next j
Sheets("Sheet1").Range("C5:G5000").ClearContents
Sheets("Sheet1").Range("C5").Resize(k - 1, 5) = Arr
End Sub