Do you mean that every sheet has to create it's own template ? Just get rid of the ws Array and the cycle For i.
Just set a variable (ws) to read the name of the sheet from which you launch the macro.
Also I would close the template just after saving it if you don't need it straight away (see note in macro).
Code
Option Explicit
Sub BuildTemplateINm()
Dim nr As Long
Dim cell As Variant
Dim lr As Long
Dim N$
Dim ws As String
ws = ActiveSheet.Name
Application.ScreenUpdating = False
Application.DisplayAlerts = False
' Loop through all sheets in sheets array
Sheets.Add.Name = "NewSheet"
Range("A1").Value = "Description"
Range("B1").Value = "Quantity"
nr = 2
With Sheets(ws)
' Find last row in column with data
lr = .Cells(Rows.Count, "D").End(xlUp).Row
' Loop through all cells in column
For Each cell In .Range(.Cells(1, "D"), .Cells(lr, "D"))
' Check to see if value is numeric and not 0
If (IsNumeric(cell.Value)) And (cell.Value <> 0) Then
' Copy cells C, D, E to columns A, B, C of newsheet
.Range(.Cells(cell.Row, "C"), .Cells(cell.Row, "E")).Copy
Sheets("NewSheet").Cells(nr, "A").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
' Increment nr counter
nr = nr + 1
End If
Next cell
End With
' Name and Save newsheet
N = ActiveWorkbook.Path & "\" & ws & ".xlsx"
Sheets("NewSheet").Move
ActiveWorkbook.SaveAs N, 51
ActiveWorkbook.Close '<- delete if you need the new template open
Application.ScreenUpdating = True
Application.DisplayAlerts = True
MsgBox "Done! " & ws & " template created."
End Sub
Display More