VBA Copy and Delete Rows loop optimisation
I've found that if you are deleting rows in a range you need to create a for loop that starts at the bottom and works your way up.  When you are using the for each loop and try deleting an item out of that range and keep looping it destroys the reference to that range.  The next iteration will throw an error.

Here's an example, (I'm just pulling this out of my head and haven't tested it, but it should get you in the right direction)

...
dim sh1Rows as integer  
dim myCell as range  

sh1Rows = sh.["A1"].end(xlDown).row

for i = sh1Rows to 1 step -1
    set myCell = sh["A1"].offset(0,i)
    if IsDate(myCell.value) and myCell.value &lt; Date - 456 Then
        sh2.cells(1,sh2.["A1"].end(xlDown) +1).entirerow = myCell.entirerow.value
        myCell.entirerow.delete
    end if
next