Книга с кодом и активная книга различаются
ThisWorkbook обозначает книгу, в которой находится выполняемый код. ActiveWorkbook относится к книге активного окна. Эти объекты часто совпадают в простом примере, но совпадение не является общим правилом. Представим учебную книгу Инструменты с макросом и отдельную книгу Данные, которую нужно обработать. В этой задаче ThisWorkbook указывает на Инструменты. Если бездумно заменить все обращения на него, результат может оказаться в книге с кодом вместо нужных данных. Сначала определяют назначение операции, затем выбирают объект.
Активность является состоянием интерфейса
Пользователь может переключить окно, а выполняемая процедура — открыть другую книгу. Поэтому повторное обращение к ActiveWorkbook позднее в работе может вернуть уже другой объект. Если целевая книга выбрана в начале, полезно сохранить явную объектную ссылку и дальше использовать её. Такая ссылка не заменяет проверку: нужно убедиться, что выбрана правильная книга и существует необходимый лист. Если условия не выполнены, операция должна завершиться понятным сообщением до записи. Продолжение с произвольным активным объектом скрывает ошибку выбора, а не исправляет её.
Диапазон тоже нуждается в принадлежности
В стандартном модуле неквалифицированное обращение к Cells обычно опирается на активный лист. Гораздо яснее обращаться через явно заданный объект листа, например ws.Cells(2, 1). Тогда в записи видна связь с ws, а числа задают вторую строку и первый столбец. При построении диапазона по двум крайним ячейкам важно квалифицировать обе границы. Выражение ws.Range(ws.Cells(2, 1), ws.Cells(10, 3)) связывает весь диапазон с одним листом. Пропущенная принадлежность у внутренних Cells может привести к обращению к другому контексту и ошибке. В модулях листов особенности неуточнённых обращений могут отличаться, поэтому при чтении чужого кода нужно учитывать и место его размещения.
Выделение не обязательно для операции
Во многих случаях VBA может работать с диапазоном непосредственно, без предварительных Select и Activate. Это уменьшает зависимость от текущего выделения, хотя само по себе не проверяет правильность выбранного объекта. Для тестирования полезно намеренно менять активное окно между подготовительными шагами в безопасной учебной копии. Если логика рассчитана на конкретную книгу, такое переключение не должно перенаправлять запись. При этом действия, которые сохраняют, закрывают или очищают реальные файлы, нельзя включать в пробный пример без отдельного контроля назначения.
Попробуйте на практике
Разберите адресацию макроса на бумаге, не изменяя рабочие файлы.
- Нарисуйте две книги: Инструменты с кодом и Данные с листом Итоги. Укажите, что результат должен попасть во вторую строку первого столбца листа Итоги.
- Отметьте, какой объект обозначает ThisWorkbook. Затем сделайте активной на схеме сначала одну, потом другую книгу и сравните значение ActiveWorkbook.
- Назначьте условные ссылки целевой книге и листу ws. Покажите, почему ws.Cells(2, 1) сохраняет принадлежность выбранному листу при переключении окна.
- Проверьте выражение диапазона от второй строки первого столбца до десятой строки третьего столбца. Убедитесь, что обе крайние ячейки относятся к тому же ws.
Как проверить результат. ThisWorkbook связан с книгой Инструменты, а целевой лист находится в Данных. Выбранный диапазон имеет девять строк и три столбца; активное окно не подменяет назначение операции.
Частые вопросы
Нужно ли всегда предпочитать ThisWorkbook?
Нет. Он подходит для обращения к книге с кодом. Для обработки другой книги требуется ссылка, соответствующая цели процедуры.
Можно ли вообще пользоваться ActiveWorkbook?
Да, когда задача действительно относится к активной книге и это проверено. Проблема возникает при неявном предположении, что активная книга всегда остаётся нужной.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.