In addition to avoiding .select/.activate (How to avoid using Select in Excel VBA, which was posted in comments), everythign coems down to HOW you select the range.
A very common code for copying a range is:
Dim lr as long 'lr = last row
lr = cells(rows.count,1).end(xlup).row
range(cells(1,1),cells(lr,1)).Copy
That allows you to programmatically define a fixed range. You could also use a full column or row, such as:
Columns("D").Copy
Columns(4).Copy 'D or 4 are interchangeable
Rows(2).Copy
You can even use a variable, which might determine a row to find based on other conditions. If I want to copy the entire last row:
Dim lr as long 'lr = last row
lr = cells(rows.count,1).end(xlup).row
Rows(lr).Copy
You can even iterate the row in a loop for activities:
Dim lr as long, i as long
lr = cells(rows.count,1).end(xlup).row
For i = 1 to lr
If cells(i,1).value = 0 Then Rows(i).Interior.Color = RGB(0, 255, 0)
Next i
Knowing how your ranges will be laid out, and using things like .Find or .Match will help select the appropriate rows/columns allowing you to have a more dynamic code, which reacts to changes in the sheet/workbook.