Microsoft Office
Программирование для Office

Избавьтесь от Select* и Active* в программах для Microsoft Office

Опубликовано: 09 авг 13
Рейтинг:

Автор: 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 избавиться не просят:)

  • актуально тем кто будет исправлять кучу чужого говнокода

    плохой путь, лучше работать с профессиональными репортерами или писать свой

  • 25 ноября 2013, 19:46 катастрофа

    и как же это будет относительно Ворда?
    и видим
    'для ссылки на нужную книгу
    'затем создаем новую книгу:
    '... или открываем существующую:
    а где код для активного документа?
    Спасибо, Ципихович Эндрю



Необходимо войти на сайт, чтобы оставлять комментарии

Раздел FAQ: Microsoft Office / Программирование для Office / Избавьтесь от Select* и Active* в программах для Microsoft Office