В комментариях много раз указывалось на диссоциацию в вашем коде. Ваш код использует неявные и явные ссылки на рабочие листы, не выполняя каких-либо необходимых проверок для предотвращения ошибок.
Комментаторы, мы вежливы и не используем строгие термины, но я не вежлив: ActiveSheet
не то, что вы думаете.
То, что вы думаете ActiveSheet
во время проектирования, практически никогда не будет равным ActiveSheet
во время выполнения. Конечно, бывают случаи, когда они есть, но такие определенности редки, если только вы не приложите усилия, чтобы затем воплотить их в реальность. Все остальное время вы должны явно ссылаться на ваши диапазоны. Считайте, что это жизненно важный навык
Предположим, вы установили указатель на книгу и открываете ее, любой лист, на который она открывается, становится ActiveSheet
. Обычно это лист, который последний раз просматривали при сохранении книги, но это ни в коем случае не гарантируется.
Что еще менее гарантировано, так это ваше предположение, что он откроется для листа «Проверка данных».
Вы можете читать и писать на листе «Проверка данных» в течение всего дня, не обращая внимания, является ли он ActiveSheet
или нет, но вы можете только Select
ячейка на нем, когда это ActiveSheet
.
Переменная рабочего листа ShName
установлена на рабочий лист «Проверка данных». Ни в коем случае вы не проверяли ShName
как ActiveSheet
, но ShName
должно быть ActiveSheet
, чтобы предотвратить ошибку в этой строке:
xlBook.Sheets(ShName).Range(Cells(StartRow, 1), Cells(EndRow, 1)).Select