Существует проблема со следующей строкой:
sh.Range("A1:D200" & lr).Select
Что происходит, если вы заполняете конец диапазона в (D200), а затем добавляете значение lastrow к этому конечному диапазону.Скажем, lastrow 50, Excel увидит диапазон, который вы установили как «D200» и «50», что делает его «D20050», что явно не то, что вам нужно.Измените строку следующим образом:
sh.Range("A1:D" & lr).Select
, которая дает вам диапазон «A1: D» и «50», делая его «A1: D50», что является правильным выходом.