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

Глава 16. Разработка утилит Excel с помощью VBA

519

конечных пользователей, то что же делает ее ценной? Ниже приведены характеристики хорошей утилиты.

Утилита привносит что-либо новое в Excel. Это может быть и новая возмож­ ность, и комбинация существующих функций, и более простой способ использо­ вания одного из существующих средств.

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

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

Утилита выглядит и работает, как встроенная команда Excel. Утилиты долж­ ны выглядеть и вести себя так же, как и встроенные команды Excel, хотя можно добавлять и индивидуальные настройки.

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

Утилита отслеживает появление ошибок. Конечный пользователь не должен видеть сообщений об ошибках VBA. Любое сообщение об ошибке, которое уви­ дит пользователь, должно создаваться автором утилиты.

Утилита предоставляет способ отмены результата собственных действий.

Пользователи, которых не удовлетворяет результат работы утилиты, должны иметь возможность отменить внесенные изменения.

Утилита Text Tools

В этом разделе рассматривается утилита Excel, которая была разработана в качестве составной части пакета Power Utility Рак. Утилита Text Tools (Текстовые инструменты) позволяет пользователю манипулировать текстом в выделенном диапазоне ячеек. В ча­ стности, эта утилита поддерживает такие операции:

изменение регистра текста (верхний регистр, нижний регистр или правильный ре­ гистр);

добавление символов в начале, в конце или в указанной позиции;

удаление текста в начале, в конце или в указанной позиции строки;

удаление лишних пробелов (или всех пробелов);

удаление символов из текста (не выводимых на печать символов, символов алфа­ вита, нечисловых символов, не алфавитных символов либо числовых символов).

На рис. 16.1 показана утилита Text Tools в действии.

Глава 16. Разработка утилит Excel с помощью VBA

521

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

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

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

Утилита не должна влиять на ячейки, содержащие формулы.

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

Утилита должна применять немодальные диалоговые окна, которые всегда ото­ бражаются на экране и готовы к применению.

Она должна быть компактной и не перекрывать данные рабочего листа.

Утилита должна разрешать пользователям отменять внесенные ранее изменения.

Пользователи утилиты должны иметь доступ к исчерпывающей справочной ин­ формации.

Рабочая книга утилиты

Утилита Text Tools реализована в виде файла надстройки XLAM. В процессе разра­ ботки я использовал рабочую книгу с поддержкой макросов XLSM. Как только я убедил­ ся втом, что все работает, я сохранил рабочую книгу в виде надстройки.

Рабочая книга утилиты Text Tools состоит из следующих компонентов.

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

Один модуль кода VBA. Этот модуль содержит объявления общедоступных пе­ ременных и констант. Кроме того, в нем находится код отображения пользова­ тельской формы и управления процедурой отмены действия. Весь код, выпол­ няющий конечные действия, сохранен в модуле пользовательской формы.

Одно диалоговое окно UserForm . Содержит пользовательскую форму. Код, вы­ полняющий обработку текста, находится в модуле кода для Use г Form.

П ри м ечан и е

Этот файл также включает результат некоторых изменений, выполненных вручную. Цель этих изменений — отображение команд на ленте (см. также раздел “Добавление кода RibbonX”). К сожалению, невозможно изменить ленту Excel с помощью VBA.

Установка н адстроек

Для установки любой надстройки, в том числе надстройки t e x t to o ls .x la m , вы­ полните следующие действия.

1.Выберите команду Файл^Параметры Excel (File^Excel Options).

2.В окне Параметры Excel (Excel Options) выберите вкладку Надстройки (Add-ins).

S t a r tT e x t T o o ls ,
S h o w T e x tT o o ls D ia lo g .

522

Часть V. Профессиональные методы программирования

3.В раскрывающемся списке Управление (Manage) выберите пункт Надстройки Excel (Excel Add-Ins) и щелкните на кнопке Перейти (Go to), после чего отобразит­ ся диалоговое окно Надстройки (Add-Ins).

4.Если устанавливаемая надстройка находится в списке Доступные надстройки (Add-Ins Available), установите рядом с ней флажок. Если же надстройка отсутст­ вует в этом списке, щелкните на кнопке Просмотр (Browse) для поиска соответст­ вующего файла X L A M или X L A .

5.Щелкните на кнопке ОК для установки надстройки.

Надстройка будет установленной до тех пор, пока вы не удалите ее из списка.

Можете пропустить пп. 1-3 приведенной выше инструкции, нажав комбинацию клавиш <Alt+TI> для открытия окна Надстройки. Эта комбинация работает во всех версиях Excel.

Как работает утилита

Надстройка Text Tools включает код RibbonX, который создает новый элемент на ленте: Главная•=>Utilities^Text Tools. Выбор этого элемента приводит к выполнению процедуры которая вызывает процедуру

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

Наличие двух вспомогательных процедур для этой утилиты ( S t a r t T e x t ­ T o o ls и S h o w T e x tT o o ls D ia lo g ) обосновывается в разделе “Добавление кода RibbonX” .

Пользователь может выбрать необходимые опции для изменения текста и щелкнуть на кнопке Применить (Apply), чтобы применить их. Изменения сразу же будут пред­ ставлены в рабочей книге. Диалоговое окно продолжает отображаться на экране. Каж­ дую операцию можно отменить. Пользователь также имеет возможность выполнить не­ которые дополнительные действия. Щелчок на кнопке Справка приведет к отображе­ нию диалогового окна справочного руководства. Щелчок на кнопке Закрыть вызывает закрытие диалогового окна. А поскольку вы имеете дело с немодальным диалоговым ок­ ном, у вас есть возможность продолжать работать в Excel в то время как будет отобра­ жаться диалоговое окно. В этом смысле оно ведет себя подобно панели инструментов.

П ользовательская ф орма утилиты

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

На рис. 16.2 показано диалоговое окно U se rF o rm утилиты Text Tools.

Нетрудно заметить, что расположение отдельных элементов управления в окне Us- e rF o rm различно в режиме проектирования и выполнения утилиты. Это происходит по­ тому, что их расположение динамически изменяется в коде. Ниже описаны главные эле­ менты диалогового окна.

Список Операция (Operation). Этот список находится в левой части формы и предназначен для указания типа выполняемой операции.

Список Процедура*!. Точно указывает текстовую операцию, соответствующую указанному в предыдущем списке типу.

526

Часть V. Профессиональные методы программирования

П роцедура U s e r F o r m _ I n it ia liz e

Эта процедура выполняется перед отображением пользовательской формы. Она из­ меняет размер формы, чтобы поместить в нее все необходимые параметры (их значения сохраняются в системном реестре). Данная процедура также определяет список пунктов меню (под названием ComboBoxOperation), которые указывают выполняемую опера­ цию. Эти пункты меню перечислены ниже:

изменение регистра;

добавление текста;

удаление на основе указанной позиции;

удаление пробелов;

удаление символов.

Процедура C om b oB oxO p eration _C h an ge

Эта процедура выполняется после выбора пользователем операции в раскрывающем­ ся списке. Она отображает или скрывает элементы управления. Например, если пользо­ ватель выбрал опцию Изменение регистра, отображается первый список (элемент управления ComboBox), в котором можно выбрать один из следующих элементов:

ВЕРХНИЙ РЕГИСТР;

нижний регистр;

Подходящий регистр;

Регистр предложения;

ПЕРЕКЛЮЧИТЬ рЕГИСТР.

Процедура A p p ly B u tto n _ C lic k

Эта процедура вызывается после щелчка мышью на кнопке Применить (Apply). Она вы­ полняет проверку ошибок, позволяющую гарантировать выбор корректного диапазона, и вы­ зывает функцию CreateW orkRange, которая позволяет убедиться в том, что не обрабаты­ ваются пустые ячейки. (См. также раздел “Повышение эффективности утилиты”.)

Процедура A p p ly B u tto n _ C lick также вызывает процедуру SaveForUndo, кото­ рая сохраняет текущие данные, требуемые для выполнения операции отмены. (См. также раздел “Отмена ранее выполненных действий”.)

Затем эта процедура использует конструкцию S e le c t Case для вызова соответст­ вующей процедуры, которая выполняет нужную операцию — вызывает одну из следую­ щих процедур:

ChangeCase;

AddText;

RemoveText;

RemoveSpaces;

R em oveC haracters.

Некоторые из этих процедур вызывают функции. Например, процедура ChangeCase может вызывать функцию T oggle Case либо S entenceC ase.

Глава 16. Разработка утилит Excel с помощью VBA

527

Процедура C l o s e B u t t o n C l i c k

Выполняется после щелчка на кнопке Закрыть (Close). Она сохраняет параметры те­ кущего состояния в системном реестре и выгружает пользовательскую форму.

Процедура H e l p B u t t o n C l i c k

Выполняется после щелчка на кнопке Справка. Отображает содержимое справочно­ го файла (стандартный компилированный HTML-файл справки).

Повышение эф ф ективности утилиты

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

Как уже отмечалось, процедура A p p ly B u tt o n _ C lic k вызывает процедуруфункцию C re a te W o rkR a n g e . Эта функция создает и возвращает объект Range, в ко­ тором нет пустых ячеек и ячеек с формулами. Например, пусть столбец А содержит

текст в диапазоне

А1:А12. Если пользователь выделит весь столбец, то функция

C reateW orkR ange

преобразует диапазон всего столбца в диапазон без пустых ячеек

(т.е. А1:А12). В результате приложение будет выполняться эффективнее, не обрабатывая ненужных данных (пустые ячейки и формулы).

Функция C re a te W o rkR a n g e использует два аргумента.

Rng. Объект Range, представляющий выделенный пользователем диапазон данных.

T e x tO n ly . Булево значение. Если оно равно T ru e , функция возвращает ячейки толь­

ко с текстовыми значениями. В противном случае возвращаются все непустые ячейки.

P riv a te

F u n c tio n

 

CreateW orkRange(Rng,

T extO nly)

1

Создает

и

возвращ ает

объект Range

 

 

 

 

Set

 

CreateW orkRange

 

= N o th in g

 

 

 

 

'

Единственная я ч е й ка ,

 

включающая формулу

 

 

I f

Rng.Count =

1 And

Rng. HasFormula

 

Then

 

 

 

Set

CreateW orkRange = N o th in g

 

 

 

 

End

E x it

F u n c tio n

 

 

 

 

 

 

 

 

 

I f

 

 

 

 

 

 

 

 

 

 

 

'

Единственная ячейка

либо

одна

объединенная

ячейка

 

I f

Rng.Count =

1 Or

Rng.Meгд е C e lIs

=

True

Then

 

 

I f T e xtO n ly

Then

 

 

 

 

 

Then

 

 

 

 

I f

Not

IsN u m e ric(R n g ( 1 ) . V alue)

 

 

 

 

 

 

Set

CreateWorkRange

= Rng

 

 

 

 

 

 

 

 

E x it

 

F u n c tio n

 

 

 

 

 

 

 

 

E lse

CreateWorkRange

= N o th in g

 

 

 

 

 

 

Set

 

 

 

 

End

E x it

 

F u n c tio n

 

 

 

 

 

 

 

 

I f

 

 

 

 

 

 

 

 

 

 

 

E lse

 

Not

IsE m p ty(R n g (1 ))

Then

 

 

 

 

 

 

I f

 

 

 

 

 

 

 

 

Set CreateW orkRange = Rng

 

 

 

 

 

 

End

E x it

 

F u n c tio n

 

 

 

 

 

 

 

 

I f

 

 

 

 

 

 

 

 

 

 

 

End

I f

 

 

 

 

 

 

 

 

 

 

 

End

I f

 

Resume N ext

 

 

 

 

 

 

 

On

E rro r

 

Rng. P a re n t.UsedRange)

 

Set

 

Rng

= In te rs e c t(R n g ,

 

I f

T e xtO n ly =

True

Then

 

 

 

 

 

528

 

Часть V. Профессиональные методы программирования

Set

CreateWorkRange

=

Rng. S p e c ia lC e lls (x lC o n s ta n ts , _

I f

x lT e x tV a lu e s )

 

 

E rr

<> 0 Then

 

= N o th in g

 

Set

CreateW orkRange

 

On

E rro r GoTo 0

 

 

End

E x it F u n c tio n

 

 

I f

 

 

 

E lse

CreateWorkRange

= Rng. S p e c ia lC e lls _

 

Set

I f

E rr

(x lC o n s ta n ts ,

x lT e x tV a lu e s + xlNum bers)

<> 0 Then

 

= N o th in g

 

Set

CreateWorkRange

 

On

E rro r GoTo 0

 

 

End

E x it F u n c tio n

 

 

I f

 

 

 

End I f

 

 

 

 

End F u n c tio n

 

 

 

П р и м еч ан и е

Функция CreateWorkRange практически повсеместно использует свойство S p e c ia lC e lls . Для получения дополнительных сведений о свойстве S p e c ia l­ C e lls создайте макрос, который выполняет различные выделения в диало­ говом окне Excel Выделение группы ячеек (Go То Special). Для перехода в это окно нажмите клавишу <F5> и щелкните на кнопке Выделить (Special) в диа­ логовом окне Переход (Go То).

Диалоговое окно Выделение группы ячеек имеет одну особенность. Обычно оно работает с текущим выделенным диапазоном. Например, если выделен целый столбец, то результатом будет подмножество ячеек этого столбца. Но если выделена одна ячейка, то диалоговое окно работает со всем листом. Именно поэтому функция C r e a te ­ WorkRange проверяет количество ячеек, которые составляют диапазон, переданный функции в качестве аргумента.

С охранение настроек утилиты

Утилита Text Tools характеризуется одним очень интересным свойством: она сохра­ няет последние используемые настройки. Это невероятно удобно, поскольку чаще всего требуется повторно выполнять одни и те же действия.

Последние настройки приложения сохраняются в системном реестре. После щелчка на кнопке Закрыть выполняется функция S a v e S e ttin g s , которая отвечает за сохране­ ние значений каждого элемента управления. При запуске утилиты выполняется функция G e tS e ttin g s , которая запрашивает настройки из системного реестра.

В системном реестре настройки утилиты сохраняются в следующем разделе.

HKEY_CURRENT_USER\Software\ VB and VBA

Program S e ttin g s \ _

T e xt T o o ls

U t ilit y \ S e t t in g s

 

На рис. 16.5

показаны эти настройки (в

окнеч-редактора системного реестра —

r e g e d i t . ехе).

В процессе просмотра кода утилиты Text Tools вы обнаружите, что для сохранения настроек используется восьмиэлементный массив (под именем U serC hoices).*B прин­ ципе, для хранения настроек можно воспользоваться переменными, но использование массива немного облегчает работу программиста.

530

 

Часть V. Профессиональные методы программирования

U s e rC h o ic e s (7)

"Н астройки",

" R em oveC haractersIndex", _

S a ve S e ttin g

APPNAME,

U se rC h o ice s(8)

 

 

S a v e S e ttin g

APPNAME,

"Н астройки",

"cb S kip N o nT e xt", _

cbS kipN o nT ext.V a lue * -1

Отмена ранее вы полненны х действий

К сожалению, в Excel не существует прямого способа отмены операции средствами VBA. Конечно, написать макрос с подобными функциями можно, но это не так уж и просто. Также, в отличие от свойства отмены в Excel, операция отмены, реализуемая утилитой Text Tools, является одноуровневой. Другими словами, пользователь этой ути­ литы может отменить лишь последнюю операцию. Дополнительные сведения относи­ тельно применения свойства отмены в пользовательских приложениях можно найти во врезке “Отмена действия процедуры VBA”.

Вутилите Text Tools отмена ранее выполненной операции осуществляется путем пред­ варительного сохранения исходных данных в рабочем листе. Как только пользователь от­ меняет операцию, сохраненные ранее данные копируются обратно в рабочую книгу.

Вутилите Text Tools в модуле M odulel общедоступные данные объявляются сле­ дующим образом.

P u b lic

UndoRange As

Range

P u b lic

U s e rS e le c tio n

As Range

Перед изменением данных процедура A p p ly B u tton C lick вызывает процедуру SaveForUndo. В начале процедуры определяются три переменные.

Set

U s e rS e le c tio n = S e le c tio n

Set

UndoRange = WorkRange

T hisW orkbook. S h e e ts ( 1 ) . UsedRange. C le a r

Объектная переменная U s e r S e le c tio n сохраняет область, выделенную пользова­ телем, благодаря чему можно отменить выделение области в дальнейшем. В данном слу­ чае WorkRange — это объект Range, который включает рабочий диапазон без пустых ячеек и ячеек с формулами. Третий оператор удаляет любые сохраненные данные.

После этого выполняется цикл.

For

Each RngArea In W orkRange.Areas

T h isW o rkb o o k .S h e e ts( 1 ) .Range

_

 

(R n g A re a .A d d re ss). Form ula

= RngArea. Form ula

N ext

RngArea

 

В цикле просматривается содержимое объекта WorkRange, а его данные сохраняют­

ся в рабочем листе (если этот объект состоит только из одного непрерывного диапазона, то в нем анализируется всего одна область).

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

A p p lic a tio n . OnUndo "Отмена изменения р е ги стр а ", "U ndoT extT ools"

Раскрывающийся список Отменить в Excel дополнится новой командой: Отменить изменение регистра (рис. 16.6). После ее выбора выполняется процедура UrrdoText- T ools, приведенная ниже.