Рейтинг:
Автор: Shocker.Pro
Прислал: Shocker.Pro
Заглавное утверждение этой статьи:
Уберите из своего кода Select, Selection, Activate
а также то, что начинается с Active (ActiveSheet, ActiveDocument, ActiveWorkbook, ActiveCell и т.п.)
Теперь разберем подробнее.
А почему нужно от всего этого избавиться?
Во-первых – код можно сильно сократить, его будет легче читать, разбирать, редактировать, он будет работать быстрее.
Во-вторых – это источник глюков программы, зачастую трудноуловимых. Прежде всего это вмешательство пользователя. Пока программа работает, пользователь может тыкнуть мышкой куда попало, переключиться на другое окно и т.п. Выделение или активная книга меняется и в лучшем случае программа вылетает, в худшем – запорет нужные данные. Также я сталкивался, что разные версии офиса могут вести себя по-разному с активными документами, и программа, написанная в одной версии Excel, работая с ActiveWorkbook, неверно работала в другой версии.
Откуда все берется?
Ну прежде всего из записи макросов. Стандартная и разумная рекомендация – если не знаешь, как сделать что-то – запусти запись макроса и сделай нужные действия. Но только макрос ведь пишет все действия пользователя, а пользователь сначала выделяет объект, а потом с ним что-то делает. Поэтому и получается, что макрос сначала записывает команду Select, а потом какие-то действия над Selection.
Записав макрос, дальше стоит его разобрать, вычленить необходимые методы и функции и убрать лишнее. Или посмотреть, как записался макрос, а дальше писать свою программу.
Как избавиться?
Рассмотрим на примере Excel. Прежде всего сама книга. В большинстве случаев ActiveWorkbook надо заменить на ThisWorkbook. ActiveWorkbook – это активная книга (которую, как я упоминал, пользователь или какие-то обстоятельства могут изменить). А ThisWorkbook – это книга, в которой находится ваша программа и она всегда одна и та же, даже если активная книга поменялась.
Иногда ActiveWorkbook используется для работы с другой книгой, открытой или созданной макросом из текущей книги. Так делать не стоит, надо поступить следующим образом:
'объявляем переменную, которую будем использовать 'для ссылки на нужную книгу Dim OtherWorkbook As Workbook 'затем создаем новую книгу: Set OtherWorkbook = Workbooks.Add '... или открываем существующую: Set OtherWorkbook = Workbooks.Open("c:\blablabla.xls")
С полученной переменной можно делать то, что раньше делалось через ActiveWorkbook. Например закрыть эту книгу:
OtherWorkbook.Close
А как избавиться от Selection?
К примеру, мы покрасим текст в нескольких ячейках на другом листе. Записанный макрос будет выглядеть так:
Sheets("Лист3").Select Range("C17:D20").Select Selection.Font.ColorIndex = 3
Но это запись действий пользователя. А нам совсем необязательно повторять все за пользователем. Мы можем покрасить текст напрямую:
Sheets("Лист3").Range("C17:D20").Font.ColorIndex = 3
А если это нужно сделать в ранее созданной (см. выше) другой книге, то так:
OtherWorkbook.Sheets("Лист3").Range("C17:D20").Font.ColorIndex = 3
А когда работа с Select, Active и прочим все же требуется?
В немногих случаях. Во-первых, когда требуется взаимодействие с пользователем. Например, пользователь на свое усмотрение выделил какой-то диапазон ячеек, а нам его нужно программой обработать. Тогда мы как раз и обращаемся к Selection. Или когда пользователю после завершения работы макроса требуется что-то отобразить или выделить. Тогда мы используем Activate или Select (как правило, как последнюю команду в работе программы).
Во-вторых, есть все-таки ситуации, в которых не обойтись без Select. Я пока столкнулся с одной ситуацией, в которой не нашел другого пути (впрочем, это не значит, что его нет), а именно программное закрепление областей в Excel:
Worksheets("Лист1").Range("B2").Select Windows(1).FreezePanes = True
Комментарии
Молодец.Спасибо.
...не нашел другого пути (впрочем, это не значит, что его нет)...
А его таки нет :)
Спасибо, что в Access от SELECT избавиться не просят:)
актуально тем кто будет исправлять кучу чужого говнокода
плохой путь, лучше работать с профессиональными репортерами или писать свой
и как же это будет относительно Ворда?
и видим
'для ссылки на нужную книгу
'затем создаем новую книгу:
'... или открываем существующую:
а где код для активного документа?
Спасибо, Ципихович Эндрю