The copy inside the loop is overwriting the previous copy. They are not additive unless you use Union.
Option Explicit
Sub AB()
Dim spWB As Workbook, spWS As Worksheet
Dim baseWB As Workbook, baseWS As Worksheet
Dim rng As Range, rngCopy As Range
Dim lastRow As Long, i As Long, numCopied As Long
Set baseWB = ThisWorkbook
Set baseWS = baseWB.Sheets("Sheet1")
' open workbook to copy from
Set spWB = Workbooks.Open("Source.xlsx", ReadOnly:=True)
Set spWS = spWB.Sheets("Sheet1")
numCopied = 0
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
With spWS
lastRow = .Cells(.Rows.Count, "D").End(xlUp).Row
For i = lastRow To 1 Step -1
' Sprawdz, czy w kolumnie C jest 0
If .Cells(i, "C").Value <> 0 Then
Set rng = .Cells(i, "A").Resize(, 30) ' A:AD
If rngCopy Is Nothing Then
Set rngCopy = rng
Else
Set rngCopy = Union(rng, rngCopy)
End If
numCopied = numCopied + 1
End If
If numCopied = 3 Then
Exit For
End If
Next i
End With
' copy
If rngCopy Is Nothing Then
MsgBox "No rows found to copy", vbExclamation
Else
rngCopy.Copy
baseWS.Range("E5").PasteSpecial xlPasteValues
Application.CutCopyMode = False
MsgBox " Copied : " & rngCopy.Address, vbInformation
End If
spWB.Close SaveChanges:=False
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True