Have you tried using code where you don't select any cells. Usually its not necessary to select cells / sheets in your code and will considerably speed up the macro when you cut out the selecting.
You might also consider turning Application.Calculation to xlCalculationManual while the model is running if the spredsheet is big and takes a long time toi recalculate after each paste operation.
The only other quirk with the code posted is that you cannot use the Paste method on a range object (annoyingly enough). You have to use the PasteSpecial method and then select Paste:=xlPasteAll. NB If you just want formulae / formats / values then have a look at the excel VBA help files for the other agruments that you can pass to this method.
Code:
Sub CopyData()
Dim shOrig As Worksheet
Dim shNew As Worksheet
Dim lngLoop As Long
Dim lngOutRow As Long
' Set up variables
Set shOrig = ThisWorkbook.Sheets("Sheet1")
Set shNew = ThisWorkbook.Sheets("Sheet2")
lngOutRow = 1
Application.ScreenUpdating = False
' Clear New sheet
shNew.UsedRange.Clear
' Loop down Original sheet
For lngLoop = 2 To 50000
' Test columns 1, 17 & 21 for criteria
If shOrig.Cells(lngLoop, 1) > 0 And _
shOrig.Cells(lngLoop, 17) = 0 And _
shOrig.Cells(lngLoop, 21) = 0 Then
' Copy Row
shOrig.Rows(lngLoop).Copy
' Paste Row
shNew.Cells(lngOutRow, 1).PasteSpecial Paste:=xlPasteAll
' Clear the clipboard
Application.CutCopyMode = False
' Increment Output Row counter
lngOutRow = lngOutRow + 1
End If
Next lngLoop
Application.ScreenUpdating = True
End Sub