That's because you are activating the sheets Sheet(ws(i)).Activate to fetch the data and the last activated sheet will be the last of the ws Array so it's the "3. ...". It isn't necessary to activate a sheet to fetch data from it; just give the right reference to the ranges used.
Now, first of all get rid of the trailing spaces in the sheet names, they only create confusion since they aren't visible.
Then try this:
Option Explicit
Sub BuildInvoiceAll()
Dim ws As Variant, sht As Variant
Dim i As Long, lr As Long, nr As Long, c As Long
Dim cell As Range
Application.ScreenUpdating = False
' Set array of worksheet names to copy from
ws = Array("1.Power Distribution - Dimmer", "2.POWER CABLES - ADAPTORS", "3.CABLES (OTHER) - CABLE CROSS")
' Array of columns to check
sht = Array("D")
nr = 15
Sheets("PROFORMA DRYHIRE").Range("A15:C70").ClearContents
' Loop through all sheets in sheets array
For i = LBound(ws) To UBound(ws)
' Loop through all columns in the column array
For c = LBound(sht) To UBound(sht)
' Find last row in column with data
With Sheets(ws(i))
lr = .Cells(Rows.Count, sht(c)).End(xlUp).Row
' Loop through all cells in column
For Each cell In .Range(.Cells(1, sht(c)), .Cells(lr, sht(c)))
' 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 main sheet
Range(.Cells(cell.Row, "C"), .Cells(cell.Row, "E")).Copy
Sheets("PROFORMA DRYHIRE").Cells(nr, "A").PasteSpecial Paste:=xlPasteValues
' Increment nr counter
nr = nr + 1
' Check to see if rows are full
If nr > 70 Then
MsgBox "Rows are full"
Exit Sub
End If
End If
Next cell
End With
Next c
Next i
Application.ScreenUpdating = True
MsgBox "Macro complete - Data Stored!"
End Sub
Display More