Well I'd like to thank everyone for there helpful comments. I couldn't have solved this issue without your help, oh wait... I did solve it without your help.

Since I'm a helpful guy, I'll provide my extremely simple fix.

In my error checking code, I needed to change the line..
[VBA]Goto SkipAD:[/VBA]

To be...
[VBA]Resume SkipAD:[/VBA]

Using GOTO to escape from an error checking routine will not reset it so will result in unpredictable results. Using resume will return cleanly and reset the error handler correctly.

I guess if anyone actually read the code they would have realised this.