Возможно, дело в объявлении переменных. Эксель вообще-то должен показывать, в какой строке ошибка. Можно попробовать вставить первой строкой в начале функции
А вообще, сказать, что код ужасен - это ничего не сказать. Все это
можно нужно выкинуть и заменить на
Sub Макрос2()
Dim i as Long
i = 0
For i = 1 To 20
if Range("H1").Value <> 1 then
Sheets(i).Range("H5:H105").Copy Destination := Sheets(i).Range("C5")
Sheets(i).Range("D5:D105").ClearContents
end if
Next i
Sheets("Лист1").Select
End Sub
Только я уже 10 лет на нем не писал, нюансы мог забыть. Ну и с копированием надо посмотреть, как копировать только значения, а не все подряд.