Selected Answer
That is because your code specifies the range to copy and delete as AutoFilter.Range and that range ends at column P. So, if the code actually works the way you want all you need to do is change how you specify the range.
The code below has two purposes. First it shows you how to check the location of a range you are about to use. That is useful in many, many instances. (I use something like it every day.) Second, it shows you how to modify the range.
Sub CutRows()
' complete the declarations before the first line of code
Dim desWS As Worksheet, srcWS As Worksheet
Dim Rng As Range ' for testing only
Application.ScreenUpdating = False ' this is the first line of code
Set desWS = Sheets("SHEET1")
Set srcWS = Sheets("SHEET2")
With srcWS
.Cells(1, 1).CurrentRegion.AutoFilter 16, "FINISH "
Set Rng = .AutoFilter.Range.Offset(1)
MsgBox "Specified range is " & Rng.Address
Set Rng = Rng.Resize(, Rng.Columns.Count + 6)
MsgBox "Modified range is " & Rng.Address
.AutoFilter.Range.Offset(1).Copy desWS.Cells(desWS.Rows.Count, "A").End(xlUp).Offset(1)
.AutoFilter.Range.Offset(1).EntireRow.Delete
.Range("A1").AutoFilter
End With
Application.ScreenUpdating = True
End Sub
After the first two lines of my additions you have two instances of the same range. One is .AutoFilter.Range.Offset(1), the other is Rng. You can use either one to subsequently copy and delete, and that is actually good practice. This isn't a very stark case but often errors occur because the object one does things with wasn't actually created. In such cases it's better to assign the object to its dedicated variable (Rng in this case) and then use that instance in the ensuing code. This is a borderline case and you may decide according to your taste.