Когда кнопка находилась в выделенном коде рабочего листа, ActiveWorkbook
гарантированно равнялся ThisWorkbook
.
Теперь, когда она находится в пользовательской форме, ActiveWorkbook
- это то, какая рабочая книга оказывается активнойкогда форма отображается, и она может даже изменить , тогда как форма отображается в зависимости от того, какой код там находится.
Неквалифицированные Worksheets
вызовы неявно ссылаются на ActiveWorkbook
:как будто они неявно делают это:
ActiveWorkbook.Worksheets("Sheet1")...
Может сработать, но если активная рабочая книга не соответствует ожидаемой, или , если кто-то зашел и изменил вкладку /имя листа от Sheet1
до Summary 2018-12-21
, затем оно разбивается: «индекс вне диапазона» означает, что к какой бы книге ни обращались, в ней нет листа с именем «Sheet1».
Это с другой стороны...
Sheet1.Cells(....)
Используется кодовое имя листа , которое не зависит от изменяемого пользователем имени вкладки.Единственный способ изменить это - вызвать редактор VBA, найти лист в Project Explorer (Ctrl + R) и изменить его свойство (Name)
в окне инструментов Свойства (F4).
Есливсе 4 инструкции означают отработку одного и того же листа, и этот лист существует во время компиляции в ThisWorkbook
(то есть в файле с кодом VBA), заставьте их все работать от Sheet1
- не извлекайте этот объект из ThisWorkbook.Worksheets
, даже меньше от ActiveWorkbook.Worksheets
.