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

Комментарии


  • <a href="http://www.wholesalejerseyschinasale.us.com">cheap wholesale jerseys</a>
    <a href="http://www.timberlandshoes-outlet.us">timberland boots</a>
    <a href="http://www.canadian-goose.us.com">canada goose jackets</a>
    <a href="http://www.ralphlaurenclearanceuk.org.uk">ralph lauren sale clearance uk</a>
    <a href="http://www.ultraboost-adidas.us.com">ultra boost</a>
    <a href="http://www.curry4s.us">curry 4 shoes</a>
    <a href="http://www.pandorasjewelrys.us.com">pandora charms</a>
    <a href="http://www.northfacejackets-clearance.us.com">north face jackets clearance</a>
    <a href="http://www.lacoste-poloshirts.us.com">lacoste</a>
    <a href="http://www.lebron15shoes.us">lebron 15</a>
    <a href="http://www.birkenstocks-outlet.us.com">birkenstock outlet store</a>
    <a href="http://www.nmd-r1.us.com">nmd adidas</a>
    <a href="http://www.coachhandbagsoutletstores.us.com">coach outlet</a>
    <a href="http://www.north-face-jackets.us.com">north face jackets</a>
    <a href="http://www.valentino-outletstore.us.com">valentino outlet</a>
    <a href="http://www.underarmouroutletonline.us.com">under armour outlet</a>
    <a href="http://www.wholesalenfljerseyscheapnfl.us.com">wholesale nfl jerseys</a>
    <a href="http://www.nike-stores.us.com">nike outlet store</a>
    <a href="http://www.canadiangoosejacket.us.com">canada goose jackets</a>
    <a href="http://www.kd10s.us.com">nike kd 10</a>
    <a href="http://www.winlike96.us.com">win like 96</a>
    <a href="http://www.airjordan11swinlike82.us">win like 82</a>
    <a href="http://www.mbt.us.org">mbt</a>
    <a href="http://www.handbagsoutlet-michaelkors.us.com">michael kors handbags outlet</a>
    <a href="http://www.jordan11winlike96.us.com">win like 96 11s</a>
    <a href="http://www.jordan11swinlike82.us.com">jordan 11 win like 82</a>
    <a href="http://www.skechers-sale.us.com">skechers shoes</a>
    <a href="http://www.lebronshoes15.us.com">nike lebron 15</a>
    <a href="http://www.nike-factory.us.com">nike factory</a>
    <a href="http://www.redjordan11.us.com">jordan 11 gym red</a>
    <a href="http://www.yeezy350boost-v2.us">yeezy boost 350 v2</a>
    <a href="http://www.kd10-shoes.us">kd 10 shoes</a>
    <a href="http://www.curry4s-shoes.us.com">curry 4 shoes</a>
    <a href="http://www.huarache-shoes.us">nike air huarache</a>
    <a href="http://www.goyard-bags.us.com">goyard handbags</a>
    <a href="http://www.canadagoosejacketoutlet.us">canada goose coats</a>
    <a href="http://www.adidasyeezy-shoes.us">yeezy boost</a>
    <a href="http://www.pandorajewelry-bracelet.us.com">pandora charms</a>
    <a href="http://www.gymred11.us.com">gym red 11</a>
    <a href="http://www.pandorauksale.org.uk">pandora</a>
    <a href="http://www.yeezysboost350-v2.us.com">yeezy boost</a>
    <a href="http://www.red11s.us.com">red jordan 11</a>
    <a href="http://www.jewelry-pandora.org.uk">pandora uk</a>
    <a href="http://www.charms-pandora.org.uk">pandora uk</a>
    <a href="http://www.nike-kyrie.us">nike kyrie</a>
    <a href="http://www.jimmychoooutlets.us.com">jimmy choo</a>
    <a href="http://www.thenorthfaceoutletonline.us.com">the north face outlet</a>
    <a href="http://www.nike-airvapormax.us">vapormax</a>
    <a href="http://www.nike-airmax2018.us">air max 2018</a>
    <a href="http://www.yeezy--shoes.us.com">yeezy boost</a>
    <a href="http://www.goyard.us.org">goyard bags</a>
    <a href="http://www.ultraboost.us.org">ultra boost</a>
    <a href="http://www.jimmychooshoessale.us">jimmy choo shoes</a>
    <a href="http://www.ralphlaurensaletuk.org.uk">ralph lauren sale</a>
    <a href="http://www.valentino-shoes.us">valentino outlet</a>
    <a href="http://www.northface-jacket.org.uk">north face uk</a>
    <a href="http://www.louboutinoutletus.us.com">christian louboutin outlet</a>
    <a href="http://www.michaelkorsoutletclearancestore.us.com">michael kors outlet online</a>
    <a href="http://www.ralphlaurenfactorystore.us">ralph lauren</a>
    <a href="http://www.curry-shoes.us">stephen curry shoes</a>
    <a href="http://www.pumafentyshoes.us.com">puma fenty</a>
    <a href="http://www.jordan11red.us">jordan 11</a>
    <a href="http://www.northfaceclearances.us">north face outlet 70 off</a>
    <a href="http://www.nikefactorystores.us.com">nike factory store</a>
    <a href="http://www.air-max-2018.us.com">nike air max 2018</a>
    <a href="http://www.rihanna-puma.us.com">rihanna puma</a>
    <a href="http://www.supreme-clothings.us.com">supremenewyork</a>
    <a href="http://www.mbtshoes-clearance.us.com">mbt shoes clearance</a>
    <a href="http://www.birkenstockoutletsandals.us.com">birkenstock sandals</a>
    <a href="http://www.pandorajewelrysite.us.com">pandora jewelry</a>
    <a href="http://www.cheapnike.us.com">nike sneakers</a>
    <a href="http://www.northface-uk.org.uk">north face jacket</a>
    <a href="http://www.air-vapor-max.us.com">nike vapor max</a>
    <a href="http://www.redbottomslouboutin.us.com">red bottoms</a>
    <a href="http://www.canadgoosesale.us.com">canada goose</a>
    <a href="http://www.supreme-newyork.us.com">supremenewyork</a>
    <a href="http://www.charmspandora.org.uk">pandora charms</a>
    <a href="http://www.adidas-outletstore.us.com">adidas outlet store</a>
    <a href="http://www.cheapnfljerseysnfls.us.com">cheap nfl jerseys china</a>
    <a href="http://www.timberlandoutletstores.us.com">timberland outlet</a>
    <a href="http://www.fitflops-sale-clearance.us">fit flops</a>
    <a href="http://www.poralphlaurenfactorystore.us.com">ralph lauren factory store</a>
    <a href="http://www.adidasoutlets.us">adidas shoes</a>
    <a href="http://www.cheapsoccercleats.us.com">cheap soccer cleats</a>
    <a href="http://www.skechers-uk.org.uk">skechers uk</a>
    <a href="http://www.jordan11-red.us.com">jordan 11 gym red</a>
    <a href="http://www.kobe12shoes.us">kobe ad shoes</a>
    <a href="http://www.pandoras-jewelry.us.com">pandora jewelry</a>
    <a href="http://www.thenorthface-jackets.us">north face jackets</a>
    <a href="http://www.kobebryant-shoes.us.com">kobe shoes</a>
    <a href="http://www.longchampbag.us">longchamp handbags</a>
    <a href="http://www.nikeclearance.us.com">nike clearance outlet</a>
    <a href="http://www.skechers-shoes.org.uk">skechers shoes</a>
    <a href="http://www.handbags-longchamp.us.com">longchamp outlet</a>
    <a href="http://www.rihannafenty.us.com">puma shoes</a>
    <a href="http://www.kyrie4-shoes.us.com">kyrie 4 shoes</a>
    <a href="http://www.underarmourclearance.us">under armour clearance</a>
    <a href="http://www.fitflop-sandals.us.com">fitflop sandals</a>
    <a href="http://www.adidas--nmd.us.com">nmd adidas</a>
    <a href="http://www.lacosteoutletstores.us">lacoste outlet</a>

  • ...не нашел другого пути (впрочем, это не значит, что его нет)...

    А его таки нет :)

  • Спасибо, что в Access от SELECT избавиться не просят:)

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

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

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

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



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

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