The way I got there was to move the one meaningful variable (oRng As Object) to a parameter of the new subroutine. Well, and I understand more what's going on than you do, because I'm a programmer

You were copying/pasting chunks of code you didn't need to copy (like the On Error GoTo 0 line of code), and you don't need the l=0 reset line anymore, because moving the Dim l as Long into the new subroutine means that it gets "reset" each time the routine is called... so it always starts as 0, each time.