Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

326

Часть III. Visual Basic for Applications

методы и способы написания программ на VBA;

примеры использования функций Windows API.

В предыдущих главах этой части был представлен вводный теоретический материал. Кроме того, в электронной справочной системе можно найти все детальные сведения, которые в книге опущены. В этой главе приведены примеры решения практических за­ дач, благодаря которым вы сможете углубить свои познания в области VBА.

Примеры, приведенные в данной главе, можно разделить на шесть категорий:

• работа с диапазонами;

• управление рабочими книгами и листами;

• методы программирования на VBA;

• функции, используемые в процедурах VBA;

• функции, применяемые в формулах рабочего листа;

• вызов функций Windows API.

Перекрестная ссылка

В последующих главах будут представлены частные примеры управления диаграммами, сводными таблицами, формами, событиями и т.п.

Работа с диапазонами

Примеры данного раздела демонстрируют принципы управления диапазонами на ра­ бочих листах с помощью VBA.

Копирование диапазона

Функция записи макросов Excel используется не столько для создания хорошего ко­ да, сколько для поиска названий необходимых объектов, методов и свойств. Программа, полученная в результате записи макросов, не всегда самая эффективная, но обычно пре­ доставляет немало полезных сведений.

Например, при записи простой операции копирования и вставки мною получено пять строк VBA-кода.

Sub

M a c r o l()

 

R a n g e(" A l " ) . S e le c t

 

S e le c t io n . Copy

 

R a n g e ( " B l" ) .S e le c t

 

A c tiv e S h e e t . P a s te

 

A p p lic a t io n . CutCopyMode = F a ls e

End

Sub

Использование примеров данной главы

Не все примеры в настоящей главе представляют независимые программы. Однако они являются выполняемыми процедурами, которые можно применять в собственных приложениях.

Настоятельно рекомендуется в процессе чтения данной главы работать за компью­ тером. Можете изменять примеры и наблюдать, что происходит. Этот практический опыт гарантированно даст вам больше, чем чтение справочников.

Глава 11. Приемы и методы программирования на VBA

327

Обратите внимание, что данная программа выделяет ячейки. Однако в VBA для рабо­ ты с объектом не обязательно его выделять. Вы никогда не узнали бы об этом важном моменте, если бы копировали показанный выше код макроса, где в двух строках содер­ жится метод S e le c t. Данную процедуру можно заменить значительно более простой — применить метод Сору, который использует аргумент, представляющий адрес места вставки копируемого диапазона.

Sub CopyRange()

Range( " A l" ) . Copy R a n g e ( " B l")

End Sub

В обоих макросах предполагается, что рабочий лист является активным и операция выполняется на активном рабочем листе. Чтобы скопировать диапазон на другой рабо­ чий лист или в другую книгу, необходимо задать ссылку. В следующем примере диапа­ зон из листа Л и с т 1 книги F ile .x ls x копируется на лист Л и с т 2 книги F ile 2 .x lsx . Так как ссылки заданы правильно, пример работает независимо от того, какая рабочая книга активна.

Sub CopyRange2 ()

Workbooks ( " F i l e l .x ls x " ) . S h e e ts ( "Л и ст111) . Range (" A l" ) .Copy _ W orkbooks( " F i l e 2 . x l s x " ) . S h e e ts ( "Л и ст2" ) . R a n g e( " A l")

End Sub

Еще одним подходом к решению этой задачи является использование для представ­ ления диапазонов объектных переменных, как показано в следующем примере.

Sub CopyRange3()

Dim

R ngl

As

Range, Rng2 As Range

Set

R ngl

=

W orkb o o ks( " F i l e l . x l s x " ) . S h e e ts ( "Л и с т1 ") .R a n g e ( " A l" )

Set

Rng2

=

W o rkb o o ks( " F i l e 2 . x l s x " ) . S h e e ts ( "Л и с т2 ") .R a n g e ( " A l" )

R n g l. Copy

Rng2

End Sub

Понятно, что копирование не ограничивается единственной ячейкой за операцию. Например, следующая процедура копирует большой диапазон. Помните, что адрес места вставки определяется единственной ячейкой (представляющей верхний левый угол вставляемого диапазона).

Sub CopyRange4 ()

Range("А 1 :С 8 0 0 ") .Copy Range (" D l" )

End Sub

Перемещение диапазона

Инструкции VBA для перемещения диапазона ячеек подобны инструкциям копиро­ ваниядиапазона (см. следующий пример). Разница заключается в том, что вместо метода Сору используется метод Cut. Обратите внимание, что для вставляемого диапазона не­ обходимо задавать только адрес левой верхней ячейки.

Следующий пример демонстрирует операцию перемещения 18 ячеек (в диапазоне А1:С6) на новое место, начиная с ячейки Н1.

Sub M oveRangelO

Range (" A l : Сб") . C ut Range ( " H I" )

End Sub

Глава 11. Приемы и методы программирования на VBA

329

Советы по работе с диапазонами

При работе с диапазонами необходимо помнить о следующем.

Для управления диапазоном его не нужно выделять в программе.

Если в коде выделяется диапазон, то соответствующий рабочий лист должен быть активным. Для активизации конкретного листа используйте метод A c t iv a t e из коллекции W o rksh eets .

Функция записи макросов не всегда генерирует самый эффективный код. Зачас­ тую после записи макроса приходится оптимизировать код, чтобы сделать его бо­ лее эффективным.

Используйте в программе VBA именованные диапазоны. Например, лучше вос­ пользоваться ссылкой Range ( " T o t a l" ) , чем Range ( "D45" ) . Во втором случае при добавлении строки над строкой 45 адрес ячейки изменится. После этого придется изменить макрос, чтобы в нем использовался правильный адрес ячейки (D46).

Если вы полагаетесь на функцию записи макросов при выборе диапазонов, убеди­ тесь в том, что при записи макроса используются относительные ссылки. Для этого воспользуйтесь командой Разработчик^ Код^Относительные ссылки (Developer^ Code^Use Relative References).

Перед выполнением макроса, который управляет каждой ячейкой в текущем диа­ пазоне, рассмотрите ситуацию, когда пользователь выделил столбцы или строки целиком. В большинстве случаев не требуется, чтобы макрос просматривал каж­ дую ячейку выделенного диапазона. На этот случай в макросе должен создаваться новый диапазон, который состоит только из заполненных значениями ячеек (см. раздел “Просмотр выделенного диапазона”).

Excel позволяет выделять несколько несмежных диапазонов. Например, можно вы­ делить диапазон, нажать клавишу <Ctrl>, а затем выделить другой диапазон. Такой диапазон можно протестировать в макросе и определить для него соответствую­ щее действие (см. раздел “Определение типа выделенного диапазона”).

Вам необходимо научиться управлять не только свойством C u rre n tR e g io n (описанным выше), но и методом End объекта Range. Метод End имеет один аргумент, определяющий направление, в котором увеличивается выделение ячеек. Оператор, представленный ниже, выделяетдиапазон от активной ячейки до последней непустой ячейки внизу.

Range ( A c t iv e C e ll, A c t iv e C e l l . E n d (x lD o w n )) . S e le c t

Как можно догадаться, три остальные константы имитируют комбинации клавиш при вы­ делении в других направлениях: x lU p (вверх), x lT o L e f t (влево) и x lT o R ig h t (вправо).

JRb

Предупреждение

К Ы Я

Будьте осторожны при работе с методом End. Если активная ячейка нахо-

 

дится на границе диапазона или диапазон содержит хотя бы одну пустую

 

ячейку, метод End может не дать требуемых результатов.

J ^ \

Компакт-диск

U g M

На прилагаемом компакт-диске находится рабочая книга (ra n g e s e le c -

 

t i o n s . xlsm ), в которой определяется несколько распространенных типов

 

выделения ячеек. Открыв ее, вы увидите новое меню — Демонстрация выде­

 

ления (Selection Demo), — содержащее команды, которые предоставляют

 

пользователю возможность получать различные типы выделений (рис. 11.2).