Часть I. ОСНОВЫ ПРОГРАММИРОВАНИЯ ДЛЯ OFFICE

Первая часть книги посвящена весьма интересной теме — созданию программ, работающих в среде текстового редактора Microsoft Word. Нет нужды говорить о его популярности в нашей стране, однако, к сожалению, немногие пользователи знают и применяют в своей деятельности возможности встроенного в Microsoft Office языка программирования Visual Basic for Applications, сокращенно именуемом VBA. А ведь с его помощью можно научить программы из пакета Microsoft Office выполнять практически все, что только может потребоваться пользователю. Более того, VBA — вполне полнофункциональный язык программирования, с помощью которого можно создавать законченные и работоспособные программы, как облегчающие работу с компонентами Microsoft Office, так и предназначенные для проведения расчетов, обработки данных.

Но самое главное — на VBA могут создавать программы даже те, кто ранее никогда не занимался программированием, причем для этого не потребуются ни толстые книги, ни дорогие курсы обучения. Необходимо лишь уметь думать: наблюдать, исследовать, ставить эксперименты, делать выводы, — проявлять способности к научному подходу.

Для написания программ на VBA вам не потребуются многостраничные руководства. Лучше всего даже, чтобы они появились у Вас тогда, когда Вы освоите по меньшей мере треть или даже половину возможностей этого языка, и тогда они будут прочитаны Вами как захватывающий детектив, а не как занудные учебники. Более того, тогда оставшиеся две трети информации о возможностях VBA будут усвоены вами гораздо быстрее и легче. Кроме того, создавая программы на этом языке, Вы получите прекрасную возможность смоделировать в данном процесе способы подхода к этому миру со стороны исследователя, экспериментатора, ученого, научиться принципам научного подхода к исследованию различных явлений или вспомнить их. И необьятный простор открывает такая, казалось бы, обыкновенная вещь, как Microsoft Office и его средства разработки программ для обучения и воспитания подрастающего поколения, — программирование в среде этого пакета программ является превосходным средством для выработки у учеников самостоятельности в исследованиях, способности сопоставлять различные факты и анализировать информацию, — всего того, что нужно разумному человеку или даже будущему ученому.

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

Программы на VBA — макросы — можно создавать для любой программы пакета Microsoft Office — для Word, Excel, Access, PowerPoint и даже Outlook. В этой книге будет рассмотрен процесс создания макросов для Microsoft Word, так как, во-первых, с этой программой приходится работать практически любому пользователю персонального компьютера, а, во-вторых, для Word создавать их несколько легче и проще, чем для других компонентов Microsoft Office. Научившись работать с VBA в Word, вам будет довольно просто перейти к программированию для остальных компонентов Office.

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

Предполагается, что читатели знакомы с программой Microsoft Word и знают основные приемы работы в этом текстовом процессоре.

* * *

На настоящее время выпущено три версии Microsoft Office, содержащие в себе возможности работы с VBA — 97, 2000 и 2002, иначе именуемая XP. За некоторыми исключениями все они между собой совместимы "сверху вниз", то есть программа, написанная для Word97 и в среде этого редактора, будет работать и в Word2000, и в WordXP. Обратное же верно не всегда: в Word2000 и особенно в WordXP добавлены новые команды VBA, и программа, их использующая, в Word97 уже не заработает.

В предстоящих главах в качестве основной среды программирования рассматривается Microsoft Office 97, так как вследствие вышесказанного наиболее разумным будет использовать в качестве среды разработки именно 97-ю версию Microsoft Office, в частности, для того, чтобы создаваемую программу могли применять пользователи всех версий Office. Об особенностях же программирования для Office 2000 и Office XP сообщается отдельно там, где эти особенности имеют какое-либо значение.


Полезные советы

Если вам необходимо отправить e-mail кому-либо, у кого не русифицировано программное обеспечение компьютера или неправильно настроен почтовый сервер (подробнее — смотрите главу 13), то стопроцентно обеспечить читаемость сообщения можно, например, таким способом.

Наберите текст сообщения в каком-либо текстовом редакторе, добившись, чтобы весь он влезал на одну страницу, но был вполне читаем с экрана. После этого комбинацией клавиш Alt+PrintScreen сделайте «снимок» экрана, — его копия в виде картинки поместится в буфер обмена. Затем вставьте содержимое буфера обмена в рисунок в MS Paint'е и сохраните его как отдельный файл (можете вырезать лишь ваш текст и сохранить только его для уменьшения размера файла).

Довольно ясно, что прочитать текст в таком файле можно будет на любом компьютере, где есть хотя бы MS Paint, и вы можете смело отправлять его адресату. Только имейте в виду, что размер файла окажется немаленьким, так что постарайтесь либо заархивировать его, либо отконвертировать в формат Jpeg или Gif.

Глава 1. Средства программирования на VBA для Word: общий обзор

Создание программы

В отличие от других средств разработки программного обеспечения, где единственным способом создания новой программы является написание ее кода и создание в визуальных редакторах диалоговых окон или использование уже готовых фрагментов кода других программ, в VBA есть уникальное средство разработки, не присутствующее больше практически нигде и позволяющее быстро научиться создавать простые макросы для компонентов Office, в том числе и для Microsoft Word, без использования описаний языка. Это средство — так называемая "запись макросов". При работе в Word можно включить специальный режим записи макросов, и тогда все действия пользователя в редакторе будут автоматически «переводиться» на язык VBA и записываться в виде текста программы. Этот текст можно потом изучить для выяснения синтаксиса и устройства языка, а также необходимым образом его модифицировать.

Для записи макроса в Word надо выбрать из меню «Сервис» пункт «Макросы», а затем из выпадающего подменю — пункт "Начать запись".

Документы Word — собственно документы с расширением".doc" и шаблоны документов с расширением".dot" — устроены так, что могут хранить в себе программы. Каждую программу, хранящуюся в документе, может вызывать на исполнение либо кнопка на панели инструментов, либо сочетание клавиш, либо пункт меню, либо другая программа. Возможно любое сочетание способов вызовов. Поэтому перед началом записи макроса пользователю предлагается сразу назначить записываемому макросу способ его вызова (рис. 1.1).



Рис. 1.1. Назначение макросу способа вызова — кнопка на панели инструментов или сочетание клавиш.


Если на данном этапе для вызова макроса не будет назначена кнопка или сочетание клавиш, то это всегда можно будет сделать впоследствии с помощью диалогового окна «Настройка».

После нажатия кнопки «Ок» окна назначения способа вызова макросу в окне Word появится панель "Запись макроса" (рис. 1.2).



Рис. 1.2. Панель "Запись макроса".


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

После окончания выполнения необходимых действий необходимо нажать левую кнопку на панели — "Остановка записи". Если необходимо прерваться и все же выделить какой-нибудь обьект мышью, то необходимо нажать правую кнопку на этой панели — «Пауза». При повторном ее нажатии процесс записи продолжится.

Пример подробного анализа результатов подобной записи будет показан в главе 3. А сейчас рассмотрим другой, более традиционный способ написания программ на VBA — посредством Редактора VBA.


Редактор Visual Basic for Applications

В Microsoft Word этот редактор вызывается из меню "Сервис"-"Макросы"-"Редактор Visual Basic" или нажатием клавиш Alt-F11. Окно редактора VBA (рис. 1.3.) состоит из следующих частей: Менеджер проектов, Окна текста программ и дизайна форм, Окно свойств, Окно отладки, Окно контрольного значения, Окно локальных переменных, Стек вызова, Окно просмотра обьектов. Каждое окно может как отображаться на экране, так и нет. Ниже мы рассмотрим все эти компоненты подробнее.



Рис. 1.3. Редактор VBA. Отображаются Менеджер проектов, Окно текста программ и дизайна форм, Окно свойств, Окно отладки


Программы на VBA для среды Word хранятся в документах и шаблонах Word. (Другие форматы для хранения макросов непригодны.) Каждый документ или шаблон, содержащий макросы, называется проектом. В окне Менеджера проектов отображаются названия всех доступных Word проектов, в состав которых входят открытые документы и шаблоны, а также шаблоны, загруженные глобально — через помещение их в папку автозагружаемых файлов Word. Кроме того, всегда в этом окне отображается шаблон Normal.dot со всеми макросами, сохраненными в нем (см. рис. 1.4).



Рис. 1.4. Менеджер проектов. Отображаются три проекта и их компоненты.


Щелкнув мышью по знаку "+" слева от названия, можно открыть список имеющихся компонентов проекта. Однако так можно поступить лишь с проектами, открытыми в Word: шаблон, загруженный глобально (т. е. путем помещения его в папку автозагружаемых файлов Word), так открыть нельзя, — чтобы получить доступ к его коду для редактирования, необходимо открыть его как файл. Иначе при попытке просмотра будет выдано сообщение "Проект недоступен для просмотра" и доступ к коду будет невозможен.

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

Компоненты каждого проекта делятся на пять больших категорий:

1. "Microsoft Word обьекты". В макросах для Word здесь имеется только один обьект — называющийся по умолчанию ThisDocument. Его контекстное меню, появляющееся при нажатии правой кнопки мыши, выглядит так, как показано на рис. 1.5.



Рис. 1.5. Контекстное меню обьекта ThisDocument.


При выборе пункта Обьект (для Normal.dot недоступен) произойдет переход к соответствующему документу — к его содержимому: тексту, графике. В документ Microsoft Word можно вставить специальные обьекты — кнопки, поля ввода текста, поля выбора вариантов и др. В этом случае после выбора пункта Программа контекстного меню обьекта ThisDocument можно написать программу, которая будет выполняться при нажатии соответствующей кнопки, введении текста и др. К написанию такой программы можно перейти и из контекстного меню самого специального обьекта в документе — выделив его, нажав правую кнопку и выбрав пункт "Исходный текст".

В Microsoft Excel в Редакторе VBA в качестве обьектов представлены все листы рабочей книги Excel по отдельности, а также сама книга как целое.

2. "Модули." Модули — это и есть то место, где хранятся сами макросы. Щелкнув два раза мышью на имени модуля, можно получить доступ к тексту программы или начать ее создавать. В одном модуле может содержаться несколько макросов.

Программы, записанные пользователем с помощью средства записи макросов, хранятся по умолчанию в модуле NewMacros шаблона Normal.dot.

Для того, чтобы создать новый модуль, необходимо из контекстного меню Менеджере проектов выбрать пункт "Вставить"-"Модуль".

3. "Модули класса". Класс — это особое понятие, играющее очень важную роль в программировании. Для начала коротко можно сказать, что в данном случае это — "тип обьектов, определяемых программистом". К примеру, надо написать программу, которая работает с электронными версиями классных журналов в школе. В каждом журнале есть множество подразделов: и список учеников, и список их оценок, и система вычисления средней оценки каждого из учеников, и список предметов, и много чего еще… Можно, конечно, на VBA описать устройство каждого классного журнала: создать списки учеников, организовать таблицы с оценками, но тогда при однотипных действиях с группой журналов (например, надо посчитать средний балл оценок всех учащихся седьмых и восьмых классов) придется включать в код очень много операций с каждым компонентом журнала. Также при добавлении нового журнала придется писать программный код для создания списка учащихся, списка предметов и др. Это все очень усложнит программу и потребует большой затраты труда программиста.

Поэтому в VBA, как и в других языках программирования, имеется понятие класса — то есть типа обьектов. Новые классы можно создавать самим. Так, можно создать класс «Журналы» и описать в его модуле класса содержимое обьектов этого класса: список учеников — (в коде это реализуется строкой Public Ученики(40) As String), предметов (Public Предметы(20) As String) и др. Теперь для создания нового обьекта класса «Журналы» — нового журнала — не надо заниматься утомительным описанием вновь создаваемых списков учеников и предметов: будет достаточно в одной строчке написать команду "Обьявить новую переменную класса Журналы" (Dim Журнал25 As Журналы) и присвоить нужные значения соответствующим разделам этого новосозданного журнала (Журнал25.Ученики(1)="Андреев" и.т.д.). Кроме того, можно в модуле класса написать программу вычисления средней оценки всех учащихся, и при необходимости сделать такой подсчет вызывать ее одной командой.

Если текст предыдущих абзацев вам пока непонятен, то вернитесь к нему позже, когда узнаете о VBA больше.

4. «Формы». Формы — это диалоговые окна программ, которые можно разработать по своему вкусу. Для того, чтобы в проект добавить форму, надо из контекстного меню в Менеджере проектов выбрать пункт "Вставить"-"UserForm". Будет создано пустое диалоговое окно, в которое можно поместить кнопки, картинки, текст и др. Пример сложной пользовательской формы — на рис. 1.6.



Рис. 1.6. Пример сложной пользовательской формы


5. «Ссылки». Программы могут запускаться на выполнение не только в результате действий пользователя, но и в результате вызова из другой программы. Однако запустить программу можно только из загруженного в Word проекта (шаблона или документа). Если постоянно загружать проект нецелесообразно (например, подобный вызов используется достаточно редко), то для запуска из загруженного проекта программы из другого, незагруженного шаблона нужно поставить на него ссылку (делается это путем простого перетаскивания иконки шаблона в окно Менеджера проектов). В таком случае будет возможен доступ ко всем программам в этом шаблоне из программ проекта, в котором находится ссылка.


Средства создания кода

Основным рабочим местом программиста на VBA является окно текста программ и дизайна форм (рис. 1.7). Именно здесь пишется текст программ и разрабатываются диалоговые окна. Для того, чтобы открыть его для какого-либо компонента проекта, надо просто два раза щелкнуть на нем мышью или выбрать из контекстного меню пункт «Программа».



Рис. 1.7. Окно текста программ и дизайна форм. Контекстная подсказка редактора VBA


Для начала написания программы надо в окне модуля или кода формы написать фразу "Sub Уникальное имя программы", после чего Редактор VBA сам добавит фразу "End Sub", и между этими двумя фразами должен заключаться текст основной части программы.

Редактор VBA — очень дружественный редактор. Он постоянно подсказывает программисту, какие параметры имеет та или иная команда, как надо корректно ее написать. Например, если набрать команду MsgBox (эта команда вызывает на экран диалоговое окно, например, такое, как всем известное окошко "Сохранить изменения в документе?") и набрать после нее открывающую круглую скобку, то над курсором сразу же появится подсказка (см. также рис. 1.7.), из которой можно получить информацию о синтаксисе данной команды, то есть о том, как конкретно нужно задавать ее параметры — в данном случае текст окошка, количество кнопок, значок и звук при появлении — в тексте программы.

Язык VBA называется обьектно-ориентированным. Это значит, что очень многие его команды имеют особенный формат, отличный, скажем, от формата языков Basic или Pascal, которые изучались в школах еще 10 лет назад. Типичная команда VBA имеет такой вид: <Обьект>.<Обьект, входящий в первый обьект>.<…>.<Тот обьект, с которым нужно произвести действие>.<Собственно действие>. Иными словами, каждая команда пишется как бы "с конца": вначале определяется то, над чем надо произвести действие — обьект, а затем само действие — метод. Разделителями компонентов команды служат знаки «точка». Вот пример такой команды:

Application.ActiveDocument.PageSetup.Orientation = wdOrientLandscape

Эта команда устанавливает альбомную ориентацию листа в документе. У обьекта Application (то есть приложение, программа, в данном случае — Word) есть подобьект — ActiveDocument (активный документ, а есть еще другие, неактивные документы, тоже загруженные в Word), у этого подобьекта есть подобьект — PageSetup (параметры страницы; а есть еще подобьекты Selection — то, что в данный момент выделено, Characters — все буквы в тексте и др.), у него есть подобьект Orientation (ориентация листа; а есть еще BottomMargin — нижний отступ, LeftMargin — левый отступ и др.), которому присваивается "="значение wdOrientLandscape — то есть альбомная ориентация листа. Такой же вид имеет и команда получения информации об ориентации листа — она будет выглядеть так:

p = Application.ActiveDocument.PageSetup.Orientation

и после ее выполнения значение переменной р будет wdOrientLandscape или wdOrientPortrait соответственно. (Более подробно синтаксис языка VBA будет рассмотрен в следующей главе.)

При написании команд редактор VBA постоянно подсказывает возможные варианты следующего шага. Например, стоит написать в тексте программы слово Application и поставить точку, как сразу появятся возможные варианты продолжения (рис. 1.8).



Рис. 1.8. Редактор VBA может сам предлагать продолжения команды


Можно мышкой выбрать нужный вариант, и он обязательно будет правильным — не в смысле верности алгоритма (это остается на совести программиста), а в смысле соответствия правилам синтаксиса и иерархии обьектов, а также правописания слова. Затем можно вновь поставить точку, и вновь будет выдан список возможных вариантов продолжения.

Есть также команда завершения слова — можно не писать целиком слово Application, а набрать Appli и нажать Ctrl и пробел. Редактор допишет слово до конца сам или предоставит возможность выбора слова, если его однозначно нельзя определить по первым буквам. Он как бы «ведет» программиста по процессу написания программы, позволяя ему сосредоточиться не на банальном синтаксисе, а на решаемой программой проблеме, не держа в памяти правила написания каждой команды.

Даже если программист не воспользуется предоставляемой подсказкой и введет всю команду вручную, то редактор не даст ему так просто двинуться дальше, если в элементарном синтаксисе данной команды будет ошибка, выдав сообщение "Ошибка компиляции" (рис. 1.9).



Рис. 1.9. Ошибка компиляции


Редактор, безусловно, не может найти ошибку, если неверен алгоритм программы — это уже дело программиста. Он не увидит ошибку и в неправильно написанном слове команды, так как посчитает тогда ее функцией — новой командой, созданной самим программистом. Но вот неправильно написанную известную ему команду отследить он может. (В приведенной на рисунке примере программист хотел заменить выделенный текст новым, написав Selection.Text:="Новый текст", но ошибся и не поставил знак двоеточия в операторе присваивания — ":=".)

Другим серьезным достоинством редактора VBA является наличие прекрасной справочной системы. Поставив курсор на любую команду или название обьекта VBA и нажав клавишу F1, можно получить подробную справку о том, зачем нужна эта команда, каков ее синтаксис и даже посмотреть пример ее использования и скопировать его себе, если необходимо. В справке VBA очень часто приводятся фрагменты кода программ, иллюстрирующие использование той или иной команды. Их можно копировать в свою программу и изменить так, как необходимо.

Подобная дружественность редактора VBA дает прекрасную возможность для самостоятельного изучения этого языка программирования. А в сочетании с средством записи макросов она практически делает ненужными огромные учебники. Достаточно записать пару макросов, с помощью справки изучить назначение каждой записанной команды, и уже можно начинать писать простейшие работающие макросы — редактор не даст ошибиться в грамматике. Надо лишь усвоить некоторые приемы анализа программного кода, о которых пойдет речь в дальнейшем.

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

Щелкнув два раза на названии формы, можно открыть окно Дизайна форм (рис. 1.10).



Рис. 1.10. Окно Дизайна форм.


Нажав на соответствующий элемент (кнопку, поле ввода, переключатель и др.) на панели инструментов "Элементы «управления» и нарисовав затем мышкой этот элемент на поле формы, можно поместить его на форму. Двойной щелчок на помещенном на форму элементе открывает окно программ пользовательской формы, где можно написать программу, которая будет выполняться при этом самом двойном щелчке на элементе. (Можно также выбрать другие действия, которые надо выполнить пользователю или другим программам, чтобы запустить такую программу, — события.) У каждой формы есть окно ее программ — реакций элементов на события, хотя оно может быть и пустым. Вызвать его можно пунктом «Программа» из контекстного меню названия формы в Менеджере проектов.

Если выбрать какой-нибудь элемент формы и из его контекстного меню выбрать пункт «Свойства», то откроется Окно свойств (рис. 1.11).



Рис. 1.11. Окно свойств элементов формы


Здесь можно задать все доступные свойства каждого элемента, например, его цвет, цвет границы, надпись, состояние — доступно/недоступно для изменений, поместить на элемент картинку из внешнего файла (пункт "Picture"). Все эти свойства также можно задавать программно, однако некоторые, вроде той же картинки, стоит задавать только в этом окне. Для получения подробного описания функции каждого элемента окна свойств (а состав этих элементов различен для каждого элемента формы) достаточно просто поставить на него курсор и нажать F1. Настоятельно рекомендуется подробно изучить предназначение всех элементов данного окна как с помощью вызова справки, так и с помощью изучения изменений в состоянии обьекта после изменения значения свойства.

Окно Просмотр обьектов, вызываемое кнопкой F2 или из меню Вид (рис. 1.12), является кратким справочником по всем возможным свойствам и методам (то есть действиям, командам) обьектов VBA. Можно посмотреть, какие свойства или методы доступны для каждого обьекта, какие обьекты в принципе существуют в VBA, вызвать справочный файл для каждого обьекта, свойства или метода.



Рис. 1.12. Окно Просмотр обьектов (справа)


На панели инструментов «Правка» редактора VBA имеются соответствующие кнопки для вызова вышеописанных функций. Так, кнопка "Список свойств/методов" позволяет увидеть возможные продолжения любой команды (то же самое можно получить, поставив после команды точку, но так неудобно делать в уже написанном тексте), а кнопка «Сведения» выводит информацию о переменной, которая в данный момент выделена. Как и в самом редакторе Word, в редакторе VBA можно вставлять закладки в текст программы для более удобного перехода к соответствующим его частям.

Все модули, входящие в состав проекта, можно сохранить в текстовом файле. Для этого в Менеджере проектов из контекстного меню правой кнопки мыши соответствующего модуля надо выбрать функцию "Экспорт файла". Модуль будет сохранен в текстовом файле с расширением".bas". Можно просто перетащить название модуля в окно Explorer'а, держа нажатой левую кнопку мыши — редактор VBA поддерживает механизм Drag-and-Drop. Вставить ранее сохраненный модуль можно через команду "Импорт файла" того же меню или путем перетаскивания его иконки в окно редактора VBA.

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


Средства отладки программы

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

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



Рис. 1.13. Сообщение об ошибке компиляции


Данное сообщение означает, что эта команда редактору VBA неизвестна. Значит — надо изменить код программы, соответственно исправив его.

(В VBA можно создавать собственные команды — функции или процедуры, которые могут вызываться так же, как и встроенные. Об этом будет рассказано в следующей главе.)

Если возникает ошибка вследствие неправильного использования команд VBA, то редактор VBA выдает диалоговое окно, в котором приводится некоторое описание ошибки. Так, при попытке выделить жирным шрифтом десятимиллионное слово в документе было выдано сообщение "Запрашиваемый номер семейства не существует" (рис. 1.14), так как десятимиллионного слова в документе не было.

В диалоговом окне на рис. 1.14, как можно видеть, есть кнопка под названием «Отладка».



Рис. 1.14. Сообщение об ошибке из-за неправильного использования команд VBA


Нажав на нее, можно перейти в режим отладки программы — то есть специального состояния редактора VBA, в котором программа может исполняться построчно, а программист имеет возможность видеть значения всех переменных программы и даже принудительно задавать эти значения. Также в режим отладки можно перейти из редактора VBA, поставив курсор внутрь программы и нажав клавишу F8.

Если ошибка произошла в макросе, находящемся в недоступном шаблоне (например, загруженным глобально через папку автозагружаемых файлов Word), то кнопка «Отладка» будет неактивна.

В режиме отладки программисту доступны следующие возможности:

1. Пошаговое исполнение программы. Выполняются все команды последовательно, но выполнение каждой команды требует нажатия кнопки F8. Если программа где-то выдает ошибку алгоритма, то можно посмотреть, на каком конкретно этапе это происходит. При пошаговом исполнении в редакторе подсвечивается желтым цветом команда, которая будет выполнена следующей.

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



Рис. 1.15. Просмотр значения переменной в режиме отладки


Кроме того, значения всех переменных программы можно увидеть в окне Локальные переменные (рис. 1.16, вызов — из меню Вид).



Рис. 1.16. Окно локальных переменных.


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

3. Точки останова. Если программа длинная, то проходить по всем ее строчкам с помощью кнопки F8 — занятие не слишком интересное и приятное. В этом случае лучше использовать точки останова, то есть отметки в тексте программы, где ее исполнение должно остановиться, а сама программа — перейти в режим отладки. Для установки точки останова нужно щелкнуть левой кнопкой мыши на сером левом поле окна модуля, и тогда появится коричневая строка с кружочком на месте точки останова (рис. 1.17).



Рис. 1.17. Точка останова. На самом деле она коричневая.


Начиная с этого места, программа будет выполняться пошагово по нажатию кнопки F8. Отказаться от пошагового выполнения можно путем нажатия кнопки F5. Точки останова полезны, когда нужно локализовать дающее ошибку место в программе, особенно если оно находится в середине текста или не единичное.

4. Окно контрольного значения. В этом окне можно задать определенное выражение, значение которого будет подсчитываться параллельно с выполнением программы. Кроме того, выделив в режиме отладки какое-нибудь выражение и нажав Shift и F9, можно увидеть его значение, а также добавить это выражение в окно контрольного значения и отслеживать его дальнейшие изменения.

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

К примеру, идет вычисление оптимального количества учеников в каждом классе с учетом множества параметров и где-то подозревается наличие ошибки: не сходится сумма количеств всех учеников во всех классах с количеством учеников в школе. Можно, конечно, обойтись без всяких там окон контрольного значения и вставить в текст программы после каждого вычисления проверку равенства суммы количества всех учеников во всех классах с численностью учеников школы, но это очень усложнит программу, да и потом придется удалять все эти добавления, — а если программа большая, то сделать это не так просто. Гораздо лучше поставить контрольное значение — сумму количеств всех учеников во всех классах — и при пошаговом исполнении программы отследить, где, на каком этапе происходит ее ненужное изменение.

5. Окно проверки или Отладки. Это окно вызывается из меню Вид — Окно отладки. В текст программы можно вставить специальные команды — Debug.Print (a+b, например — если надо отслеживать значение этой суммы). Тогда при выполнении этой команды в Окне отладки будет печататься то, что задано в ее параметрах (рис. 1.18).



Рис. 1.18. Окно отладки.


Возможности применения этого окна многообразны. Можно выводить в него сообщения (командой Debug.Print) в случае выполнения или невыполнения какого-либо условия. Можно отображать в нем промежуточные результаты вычислений для контроля их правильности — чтобы не смотреть и искать нужное выражение в окнах Локальных переменных или Контрольного значения, а получать их сразу, перед глазами. Можно даже использовать это окно как маленький калькулятор или командную строку, и тогда при нажатии Enter после ввода команды она будет тут же выполнена! Надо только перед самой командой писать слово Print, если команда должна выдать какой-нибудь результат в этом же окне.

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

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

Во время работы макрокоманды ее можно прервать в любой момент нажатием клавиш Ctrl и Break. После этого будет возможен переход в режим отладки с места остановки или завершение программы.

Для выхода из режима отладки до завершения полного выполнения программы необходимо выбрать функцию Сброс из меню Запуск или нажать на панели «Отладка» кнопку "Сброс".

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

И помните, что вы можете всегда получить подробную справку по любой команде, поставив на нее курсор и нажав клавишу F1. В Справочной системе по VBA для русской версии Microsoft Office 97 некоторые разделы Справки даже переведены на русский язык, но, к сожалению, в последующих версиях Office это доброе начинание продолжения не нашло.

Очень полезно при разработке программ на VBA смотреть примеры использования команд, приводимые в справке — в разделах «Example» многих справочных окон (рис. 1.19). Если вам никак не удается создать работающий фрагмент кода программы — посмотрите в справке в разделе примеров, не встретится ли вам там то, что вы так долго пытались создать. Все фрагменты кода в справке можно свободно копировать в свои программы. Во всяком случае, в справке все команды написаны грамотно и правильно.



Рис. 1.19. Фрагмент кода в справке


Descent из недр Excel'а

Descent — это игра-симулятор космического корабля, перемещающегося в инопланетных шахтах. А Excel — это программа для работы с электронными таблицами. Казалось бы, что между ними может быть общего? А общее есть. Оказывается, в Excel 97 встроена «леталка»: игра, смысл которой заключается в полете над местностью и просмотре открывающихся красот. Вот как ее можно запустить.

1. Запустите Excel 97 и проследите, чтобы в пункте Сервис-Параметры-Общие не стояла отметка в пункте "Стиль ссылок R1C1".

2. Создайте чистую таблицу. Нажмите F5 и введите в строке ссылки для перемещения фразу "x97:l97" (т. е. переход к ячейкам от X97 до L97 с их выделением). Нажмите Ввод.

3. Вы перейдете к строке номер 97. Нажмите Tab, а затем, удерживая Shift и Ctrl, щелкните левой кнопкой мыши по иконке "Мастера диаграмм". Подождите немного.

Вот вы и в Excel Descent! Все управление — мышью. Левая кнопка — ускорение вперед, правая — назад, движения мыши задают направление. Выход — Esc. Подлетев к центру местности, можно увидеть камень, а на его поверхности — список имен разработчиков.


Descent из недр Excel'а


К сожалению, в последующие версии Excel'а данная игра уже не включалась. Однако, скажем, в Excel 2000 есть не менее увлекательная игра — автогонки. Как ее вызвать? Читайте дальше, на одной из таких же врезок данная информация будет приведена.


Секрет Internet Explorer'а

Если вставить в пустой html-документ строку , а потом открыть этот файл в Microsoft Internet Explorer версии 4 или 5, то на экране появятся весьма интересные визуальные эффекты. К сожалению, в 6-й версии этого браузера данный прием уже не работает.

Глава 2. Основы языка Visual Basic for Applications

Для полного описания возможностей VBA потребовалось бы несколько толстых книг. Поэтому я не буду описывать все команды VBA, рассказывать об их формате и требуемых параметрах — про это очень подробно рассказано в справке, да и средства подсказки тоже не дадут ошибиться. Если необходимо узнать, какая команда позволяет программно реализовать ту или иную возможность Word, то можно воспользоваться средством записи макросов, а потом почитать в справке о каждой записанной команде.

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


События, методы, свойства

Когда-то давным-давно программы, написанные и работавшие тогда еще под MS-DOS, получали от пользователя данные, обрабатывали их и выдавали затем результат. Почти любая программа предусматривала в своей работе период ввода данных, период обработки, период выдачи результата. Подобные действия были принципом работы Dos-овских программ. И программирование их называлось структурным — надо было строго и последовательно разрабатывать алгоритм, реализовывать заданный порядок действий программы, в который в процессе работы пользователь в момент, для этого не предназначенный, вмешаться не мог, разве только принудительно остановив программу.

С появлением операционной системы Windows стал широко известен другой принцип программирования и создания алгоритмических языков — принцип объектно-ориентированного языка.

Это значит, что основная направленность разработчика сместилась с действия на объект — на его реакции на действия пользователя, на его свойства и на их изменение. И VBA является типичным представителем объектно-ориентированных языков, как по своему синтаксису, так и по архитектуре программ. Основными понятиями объектно-ориентированного языка являются объект, свойство, метод, событие.

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

Почти каждый объект внутри себя имеет подобъекты, которые, в свою очередь, являются полноценными объектами и могут иметь свои подобъекты. Например, у объекта «Документ» есть подобъект "Десятое предложение", у которого есть подобъект "Второе слово", у которого есть подобъект "Третья буква". С помощью объектно-ориентированного языка VBA можно обратиться к любому объекту, если знать его иерархию — то есть все те объекты, чьим подобъектом он является.

Свойство — это любая характеристика объекта. К примеру, у объекта — первой буквы документа есть свойства: выделение жирным, выделение цветом, подчеркивание, выделение курсивом, регистр и много еще других. У объекта — документа есть свойства: наличие автоматической расстановки переносов, наличие автоматической проверки грамматики и др.

Большинство свойств объектов VBA можно задавать программно, однако есть свойства Read-Only — не допускающие изменений.

Многие свойства объектов Word также задаются через стандартные диалоговые окна Word — например, Файл-Параметры страницы или Сервис-Параметры, однако их всегда можно задать и в программе, а соответствующие диалоговые окна использовать при записи макроса для того, чтобы посмотреть синтаксис команды задания того или иного свойства.

Метод — это какое-либо действие над объектом. Например, печать текста или поиск текста в документе. У многих методов есть параметры метода, позволяющие задать параметры действия. Вот пример:

With Selection.Find

Text = "Этот текст надо заменить"

Replacement.Text = "Заменить на этот текст"

Forward = True

Wrap = wdFindContinue

Format = False

MatchCase = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

В данном примере вначале объекту VBA «Find», являющемуся подобъектом объекта «Selection», задаются необходимые свойства".Text", ".Forward", ".Format" и другие. Затем выполняется метод".Execute" для объекта "Selection.Find" с параметром "Replace:=wdReplaceAll"(т. е. "Заменить все"). Команда With … End With позволяет не писать для каждого свойства или подобъекта полное название соответствующего объекта, что дает возможность экономить место и делать программу лучше и быстрее работающей.

Свойства и методы по-разному отображаются в контекстной подсказке. Так, против названий свойств стоит серый символ указывающей руки, а против названий методов — зеленый значок летящей коробки (см. на рис. 1.8 в предыдущей главе).

Событие — это то, что "происходит с объектом помимо его воли", "результат действия какого-то другого метода". Это "все, что случается" с объектами по милости пользователя или программы. Нажатие кнопки, набор буквы, клик мыши, наступление какого-либо момента времени, завершение работы любой другой программы, — все это события.

События — основа работы любой программы. И даже если программа должна работать автономно (например, планировщик заданий), то в качестве событий используется наступление того или иного времени на системных часах. Так, когда пользователь нажимает кнопку на форме, происходит событие нажатия этой кнопки.

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

На каждое событие пишется своя подпрограмма, которая это событие «обрабатывает» — то есть выполняет определенные действия, которые должны быть выполнены, когда это событие происходит.


Типы данных и объявление переменных

Все переменные в программе на VBA могут содержать какую-нибудь информацию: текст, число, утверждение истинности и др. В зависимости от вида содержимого они подразделяются на типы данных, — соответственно текстовые, числовые, булевые (то есть принимающие значения «да» или «нет», соответственно по-английски «True» или "False"). В VBA определено большое количество различных типов данных, которые может содержать переменная. Вы можете получить информацию о всех возможных типах данных VBA из Справки, найдя в Предметном указателе раздел "Типы Данных" (рис. 2.1).

Так, переменная типа Integer — это целое число -32 768 до 32 767, а переменная типа String — это строка текста длиной до двух миллионов символов.



Рис. 2.1. Справка по типам данных VBA


В зависимости от типа данных с переменной можно производить те или иные действия и вычисления — с числовыми математические, с текстовыми — текстовые (выделение подстроки из строки, получение отдельных символов из строк и др.

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



Рис. 2.2. Область описаний программы


Для этого нужно вставить туда описание переменной вида "Dim x(переменная) As (тип данных): Dim a As Integer". Вместо слова Dim могут также использоваться слова Public и Private.

Переменная, объявленная как Public, может использоваться и программами из других модулей и форм, при этом она своего значения не теряет, а переменные, объявленные как Private или Dim, могут использоваться только в программах модуля, в котором они объявлены. При наличии такой же переменной в программах другого модуля ее значение не будет передаваться в них при их вызове из программы модуля, где она объявлена.

Как Public или Private переменная может быть объявлена только в разделе описаний переменных. С помощью же инструкции (то есть команды, не выполняющей реальных действий) Dim она может быть объявлена и в тексте программы, но тогда ее другие модули уже использовать не смогут никак.

Объявление типа переменных нужно программе, чтобы она заранее отвела под них именно столько оперативной памяти, сколько нужно для размещения именно такой переменной. Для логической — хватит и одного бита, для буквенной — нужен целый байт, а для строковой или числовой — значительно большие обьемы. Можно вообще не объявлять специально переменные, включая их в текст программы по мере надобности, так как тогда VBA присвоит им автоматически специальный для таких случаев тип данных Variant и отведет для каждой переменной максимально возможную область памяти, что, впрочем, не имеет особо отрицательного значения из-за большого обьема оперативной памяти на современных компьютерах.

Тип данных Variant отличается еще и тем, что переменные с таким типом автоматически могут преобразовываться в нужный другой тип, например, если переменная «х» имеет тип Variant и значение 2 (число), то после команды "x=Str(x)", которая преобразует число в строку, она уже будет иметь значение «2», то есть текстовая строка с цифрой «2». Такое преобразование было бы невозможно, если бы переменная «х» была объявлена как Integer.

Может показаться, что определять все переменные как тип Variant или вообще не включать в модуль раздел описаний является очень хорошим решением, однако стоит помнить, что необъявленные переменные не могут быть использованы в других модулях или формах, а, кроме того, переменные типа Variant занимают очень много места в оперативной памяти. Можно запретить для себя использование необъявленных переменных, вставив в начало модуля, в верх раздела описаний инструкцию Option Explicit, и тогда программа остановится и перейдет в режим отладки, если вдруг наткнется на такую переменную.

Стоит быть внимательнее с типами данных, так как в некоторых случаях неправильное их использование может дать ошибку. Например, переменная с типом Integer не может превысить значение 32 767; если же надо использовать большие числа, то следует определить ее тип как Long, а если она может быть еще и дробной, то — Double.


Процедуры и функции

В принципе любая программа для каждого конкретного случая может быть написана в виде одного длинного блока текста. Однако такой код будет крайне нерациональным. Например, в программе необходимо несколько раз подсчитать сумму всех членов арифметической прогрессии для разных чисел. Можно, конечно, считать результат каждый раз по известной формуле, но это очень усложнит код. А если неизвестно, для какого количества чисел надо считать эту сумму (например, это определяет пользователь), то написание программы становится почти невозможным. Поэтому в VBA, как и в других современных языках программирования, есть понятие процедур и функций, иначе называемых подпрограммами.

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

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

Функция же — это программа, которая не только получает из другой программы какую-нибудь информацию, но и возвращает той программе определенное значение, которое может быть ею в дальнейшем использовано.

В VBA любая процедура, получающая данные из другой программы, имеет следующий формат:

Sub "Название процедуры"("Получаемая переменная" As "Тип данных получаемой переменной")

"Текст процедуры"

End Sub

Получаемых переменных может быть несколько. Для каждой из них желательно указать ее тип, но это можно опустить.

Вызов процедуры происходит так же, как и вызов любой команды VBA, — путем указания ее названия и передаче ей соответствующих значений переменных, указываемых после имени процедуры в команде ее вызова, как, например, в этой программе:

Sub Main()

Dim a As Integer

a = 1

uvelich a, 3

MsgBox a

End Sub


Sub uvelich(b As Integer, c As Integer)

b = b + c

End Sub

Здесь из процедуры Main вызывается процедура uvelich, которой передаются два параметра — a (равный 1) и второй — число 3. Процедура uvelich увеличивает первую переданную переменную на значение второго переданного числа, а затем Main отображает результат.

Стоит помнить, что если в заглавии процедуры указываются типы данных переменных, то и в вызывающей процедуре передаваемые значения должны быть определены и иметь тот же самый тип, иначе VBA выдаст сообщение об ошибке.[2]

Переменные могут передаваться в процедуру двумя способами — только для чтения или и для изменения. По умолчанию переменные могут в функции изменяться. Как, скажем, в вышеприведенном примере — переменная «a» была передана в процедуру (под именем «b», чтобы лучше проиллюстрировать этот момент) и там изменилась (к ней прибавили величину переменной "с"), и затем в исходной программе она тоже стала иметь новое измененное значение.

Если же не нужно, чтобы переменная в процедуре менялась (скажем, процедура использует переменную для каких-то своих нужд, не связанных с исходной программой), то перед именем этой переменной в заголовке процедуры следует поместить инструкцию ByVal. Тогда процедура просто использует переменную так, как в этой процедуре описано, возможно, изменив ее значение, а программа, вызвавшая процедуру, дальше будет работать с прежним значением переменной.

К примеру, если бы заголовок процедуры uvelich в вышеприведенном примере имел вид Sub uvelich(ByVal b As Integer, c As Integer), то никакого увеличения переменной «a» не произошло бы и программа отобразила бы в качестве результата число 1. Однако в самой процедуре uvelich соответствующая переменная увеличилась бы на 3 и, если бы последняя ее команда была бы MsgBox b, то она отобразила бы значение 4.

Функция отличается от процедуры тем, что она передает в вызвавшую ее программу определенное значение, которое может быть использовано в дальнейшей работе программы. В частности, при использовании функции вышеприведенный пример мог бы иметь такой вид:

Sub Main()

Dim a As Integer

Dim d As Integer

a = 1

d = uvelich(a, 3)

MsgBox d

End Sub


Function uvelich(ByVal b As Integer, ByVal c As Integer) As Integer

uvelich = b + c

End Function

Как нетрудно видеть, программа присваивает переменной «d» значение, вычисленное функцией.

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

Sub Main()

Dim a As Integer

Dim d As Integer

a = 1

d = uvelich(a, 3)

MsgBox d

MsgBox a

End Sub


Function uvelich(b As Integer, c As Integer) As Integer

uvelich = b + c

b=1555

End Function,

то программа бы в качестве значения переменной «а» отобразила бы число 1555, а не 1.

Указания типов переменных в заголовках функций и процедур необязательны — их можно опустить. В этом случае будет считаться, что все передаваемые переменные могут иметь любой тип (точнее, они просто преобразуются в тип Variant и такими уже используются в подпрограмме). Однако необходимо строго следить за соответствием типов переменных в заголовках подпрограмм и в вызывающей их программе. Так, если в заголовке функции указано, что первая переменная, передаваемая ей, имеет тип Integer, то та переменная, которая передается в функцию как первая (в последнем примере — "a"), должна быть определена именно как Integer до вызова функции (что мы и видим в этом примере).

Перед заголовком функции или процедуры можно поставить инструкции Public или Private ("Private Function uvelich(b As Integer, c As Integer) As Integer"). Функция или процедура, объявленная как Public, может вызываться и из других модулей, в то время как функция или процедура, объявленная как Private, доступна только из данного модуля.

По умолчанию все функции и процедуры считаются объявленными как Public (а переменные — объявленные как Private!).

Если в программе есть вложенные процедуры или функции (то есть процедура или функция вызывает другую процедуру или функцию, которая, в свою очередь, вызывает еще одну процедуру или функцию и.т.д.), то их взаимоотношения ("кто кого вызывает?") удобно при отладке отслеживать с помощью окна Стек Вызова (рис. 2.3), в котором видны все произошедшие вызовы.



Рис. 2.3. Окно Стек вызова.


В выпадающем меню в правом верхнем углу окна программы (см. на рис. 2.2) перечислены все процедуры и функции открытого модуля. Это меню можно использовать для быстрого перехода к необходимому месту модуля, а также в раздел описаний переменных, указание на который стоит в этом меню первым.

Главная процедура — собственно программа — не может иметь параметров (в ее заголовке должны стоять пустые скобки). Только таким процедурам можно назначать кнопки и сочетания клавиш для их вызова на выполнение.

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

Команда "Шаг с выходом" доступна в любой процедуре или функции, включая главную, и выполняет в обычном режиме все команды до конца процедуры или функции, переходя затем в режим пошагового исполнения в вызвавшей программе.

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


Работа с формами

Формы — это окна интерфейса программы. С их помощью можно сообщать пользователю необходимую информацию или получать ее от него. Для создания форм используются средства редактора VBA. Если хотите наглядно посмотреть, что такое форма — откройте окно установки параметров шрифта (меню "Формат").

Создав форму (из меню правой кнопки мыши в Менеджере проектов выберите Вставить-UserForm) или дважды щелкнув на имени существующей формы, можно попасть в окно Дизайна форм. На появившейся панели инструментов "Панель управления" (если ее нет, то ее можно вызвать из меню Вид-Панель элементов) представлены все возможные элементы формы (рис. 2.4):


…???…

Рис. 2.4. Панель инструментов с компонентами форм


1. Поле отображения текста — отображает текстовую информацию. Просто текст на форме — совет пользователю, к примеру.

2. Поле ввода текста — дает пользователю возможность ввести текстовую информацию. Потом введенные данные можно обрабатывать в программе.

3. Несколько видов списков — средства выбора одного варианта из нескольких представленных, вроде выпадающего списка шрифтов на панели инструментов «Форматирование» в Word.

Значения элементов списков задаются только в программе — при разработке формы с помощью окна "Дизайн форм" их задать нельзя.

4. Флажок — элемент, который независимо от других может находиться в трех состояниях: включенном, выключенном (могут быть определены как пользователем, так и программистом) и неактивном (определяется программой).

5. Переключатель — элемент, который также может находиться во включенном, выключенном и неактивном состояниях. В отличие от флажка, переключатели должны быть обьединены в группы с помощью элемента № 7 — рамки — и, если один из переключателей в группе включен, то остальные включены быть не могут.

В Microsoft Word имеются диалоговые окна, содержащие как флажки, так и переключатели. Так, почти все вкладки меню Сервис-Параметры состоят из флажков, а меню Вставка-Сноска — из переключателей.

6. Выключатель. Это кнопка, которая может находиться в нажатом или отжатом состоянии. Например, в Microsoft Word так себя ведут кнопки показа скрытых символов или форматирования текста курсивом, жирным шрифтом, подчеркиванием.

7. Рамка. Отображает прямоугольник с заголовком. В основном используется для обьединения групп переключателей (тех, что под номером 5 в нашем списке). В одной форме может быть несколько рамок и, как следствие, несколько групп переключателей, могущих действовать независимо друг от друга.

8. Командная кнопка. Обычная командная кнопка вроде кнопок «Ok» или «Отмена» в любом диалоговом окне.

9. Набор вкладок и 10. Набор страниц. Представляют из себя набор страничек-вкладок вроде вкладок «Общие», «Сохранение», «Печать» и др. в диалоговом окне Word Сервис-Параметры. Отличие между этими двумя элементами состоит в том, что 9-й элемент при переключении на другую страничку совершенно не затрагивает другие элементы формы, даже и находящиеся на нем, и изменения в состоянии других элементов можно эадать только программно. 10-й же элемент при своем переключении принудительно (т. е. вне зависимости от программы) скрывает элементы на одной своей странице и показывает элементы на другой.

Если привести пример, то 9-й элемент может использоваться в программе — базе данных, отображая вкладки с именами сотрудников. На каждого сотрудника имеется стандартная информация в нескольких полях отображения текста, и количество этих полей для всех одинаково. В этом случае разумнее использовать именно 9-й элемент, соответственно изменяя содержимое полей отображения текста при переключении вкладок, чем создавать с помощью 10-го элемента набор страничек с отдельными полями отображения текста на каждой, что приведет к резкому увеличению и усложнению программы.

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

11. Полоса прокрутки. Такая же, как и в окне Word. Может передавать в программу число, равное расстоянию в пунктах от ее начала. Верхний предел расстояния неограничен.

12. Счетчик. Две нажимающиеся кнопки со стрелками. Может передавать в программу свое значение от 1 до 100.

13. Рисунок. В этот элемент можно вставить из файла рисунок, который будет храниться в форме (и шаблоне или документе с ней). Для вставки самого рисунка нужно после помещения на форму элемента управления Рисунок в Окне свойств выбрать пункт «Picture», нажать на кнопку слева от него и в появившемся окне открытия файла выбрать нужную картинку — рис. 2.5.

У каждого элемента имеется свое уникальное имя, а также набор свойств. Их можно посмотреть в Окне свойств, выделив элемент и выбрав из контекстного меню правой кнопки мыши пункт «Свойства».

Стоит внимательно изучить все возможные свойства для каждого элемента, по возможности осознав их предназначение. При необходимости можно вызвать справку по каждому свойству, поставив на него курсор и нажав F1.

Большой набор свойств также имеет сама форма. С помощью выпадающего меню в Окне свойств можно быстро перейти к свойствам необходимого элемента (рис. 2.6).


…???…

Рис. 2.5. Вставка рисунка. на форму


…???…

Рис. 2.6. Выпадающее меню Окна свойств — навигатор по элементам формы


Среди наиболее распространенных свойств, имеющихся почти у всех элементов — Caption (т. е. надпись на поверхности или в заголовке, если он есть), Top и Left — координаты верхнего левого угла элемента, Height и Width — высота и ширина, Enabled — доступность для изменений пользователем, TabIndex — число, показывающее, в какую очередь на данный элемент перейдет фокус (т. е. возможность изменения пользователем содержания или состояния) при переходах между элементами с помощью клавиши табуляции (можно запретить такой переход на какой-либо элемент, указав его свойство TabStop как False). Обратите внимание на свойства Picture, PictureAlignment, PictureSizeMode, PictureTiling собственно формы — с их помощью на поверхность формы можно поместить какой-нибудь фоновый рисунок.

Необходимо помнить, что создание элемента — только начало работы над формой. Сам по себе элемент никаких действий не выполняет, за исключением тех, которые его определяют. Кнопка — нажимается под мышкой или Enter'ом, список показывает значения, во флажке можно поставить и убрать галку, но не более того! Для того, чтобы элемент выполнял какое-нибудь действие при действии с ним, нужно написать для него программу реакции на события.

Событий, могущих произойти с элементом, много. Это и двойной щелчок мыши на нем, это и проводка мыши над ним, это и ввод текста в поле ввода, это и нажатие на вкладке, это и переход к другому элементу… Для того, чтобы написать программу обработки реакции на событие, нужно два раза щелкнуть на элементе. Откроется окно написания программ реакций на события, и автоматически написанная заготовка будет иметь вид:

Private Sub CommandButton1_Click()

End Sub

Теперь в текст этой процедуры можно вводить команды, которые выполнятся, если событие в заголовке — Click мыши — произойдет. Это событие считается стандартным для кнопок, флажков, рисунков, рамок, переключателей и окон отображения текста. Для остальных элементов — полей ввода текста, полос прокрутки, счетчиков и др. — стандартным считается событие Change, то есть их изменение.

Список возможных событий для элемента можно получить, поставив курсор внутрь процедуры обработки стандартного события и выбрав нужное из выпадающего меню справа вверху окна написания программы. В выпадающем меню слева вверху этого окна указаны все процедуры и функции программы реакции формы на события (рис. 2.7).


…???…

Рис. 2.7. Выпадающий список событий.


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

У некоторых событий есть параметры, с которыми информация о его происшествии передается программе. Так, процедура обработки события KeyDown (то есть нажатия какой-либо клавиши тогда, когда активен данный элемент) имеет вид

Private Sub CommandButton1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

End Sub

Переменная KeyCode будет после срабатывания данной процедуры будет иметь значение, равное коду нажатой клавиши, а переменная Shift — 1, если соответствующая клавиша была нажата, и 0, если нет. Эти переменные можно использовать в процедуре.

Все свойства, задаваемые в Окне свойств, можно изменять и из программы. Например, команда TextBox1.Enabled=True даст возможность пользователю ввести текст в поле ввода TextBox1, а команда CheckBox1.Value=False уберет отметку из флажка с именем CheckBox1. Эта возможность делает формы VBA динамическими — то есть содержимое форм может меняться немедленно в ответ на действия пользователя без выгрузки и повторной загрузки формы.

Форма может работать как обычное диалоговое окно программы для Windows, — например, выбор пользователем значения из списка может каждый раз выводить в какой-нибудь из допускающих такой вывод элементов формы определенный текст, разный для разных выбранных значений.

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

Для просмотра формы в режиме выполнения (то есть так, как она будет выглядеть в готовой программе) надо нажать клавишу F5 — ту же, что и для запуска на выполнение обычной программы. Все средства отладки, описанные выше, работают и при отладке форм.

Стоит иметь в виду, что после выгрузки формы (методом Unload Me) все переменные, описанные в программе реакции формы на события, обнуляются. Поэтому после выгрузки формы получить от нее какие-либо данные уже нельзя. Если в результате работы формы в основную программу должны передаваться какие-либо данные, то тогда нужно в основной программе объявить несколько переменных с помощью инструкции Public (т. е. сделать их доступными для чтения и изменения из любого другого модуля), а затем в программе реакции формы на события записать в них всю необходимую информацию, полученную от пользователя, и использовать значения этих переменных в основной программе.

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

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

Операторы цикла и перехода

Если необходимо повторить ту или иную группу операций несколько раз, то используются операторы цикла: Do…Loop, For…Next, For Each…Next и While…Wend.

Если необходимо совершить те или иные действия в зависимости от наличия или отсутствия выполнения какого-либо условия или в зависимости от значения той или иной переменной, используются операторы условия: If…Then…Else и Select Case.

Если необходимо совершить переход к другой части той же программы, то используется оператор GoTo "имя метки". Там, куда должен быть совершен переход, на отдельной строке должна стоять метка с соответствующим именем, а после нее — двоеточие.

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


Полезный совет

Если у вас на компьютере установлено несколько версий Microsoft Office, то вы наверняка сталкивались с одной весьма неприятной ситуацией. Microsoft Word, начиная с 2000-й версии, при каждом своем запуске сканирует системный реестр и перепрограммирует открытие файлов. doc "на себя", заставляя их открываться именно в новой версии, а не в старой. Помимо того, что это занимает немало времени, подобная ситуация мешает использовать на компьютере сразу две версии Word, работая в старой и постепенно осваивая новую.

Для того, чтобы «отучить» Word2002 (из OfficeXP) перерегистрировать расширения файлов при каждом запуске, создайте в системном реестре, в разделе HKEY_CURRENT_USER\Software\Microsoft\Office\10.0\Word\ Options параметр NoRereg, имеющий формат Dword и равный 1, а чтобы сделать то же с Word2000, отредактируйте так же содержимое раздела HKEY_CURRENT_USER\Software\ Microsoft\Office\9.0\Word\Options. Подробнее о системном реестре вы можете узнать в главе 14.

Глава 3. Создание первой макрокоманды

В предыдущих двух главах рассказывалась о языке Visual Basic for Applications (сокращенно — VBA), его возможностях и правилах, а также о Редакторе VBA — средстве создания программ на этом языке в среде Microsoft Office. Теперь же на наглядном примере рассмотрим процесс создания простой макрокоманды для Word, подробно обьясняя и иллюстрируя все шаги этого процесса.

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

* * *

У программы Microsoft Word есть огромное количество возможностей по работе с текстом. И огромные возможности по замене и поиску, и средства помещения в документ графики, не уступающие многим современным издательским системам, и средства оформления документов красивыми шрифтами и границами… Казалось бы — что еще надо, все необходимые возможности уже учтены создателями Word? Однако иногда перед пользователями встают такие задачи, разрешить которые с помощью стандартных средств Word очень трудно, а то и вовсе невозможно. Но для этого в Word, как, впрочем, и во всех компонентах пакета Microsoft Office, как раз и есть очень мощное средство разрешения подобных проблем: встроенный язык программирования.

Вот наглядный пример, когда именно написание программы-макроса — единственный более-менее достойный выход из проблемы.

Все документы на моем компьютере оформлены приблизительно одинаково — для удобства редактирования, переноса текста из одного документа в другой и др. Можно даже сказать, в чем заключаются эти мои предпочтения — шрифт Times New Roman, 12 пунктов, выделения — жирным и курсивом, выравнивание по ширине, все отступы абзацев равны нулю, а красная строка — 1 см. Именно в таком формате я держу все свои документы Word. Кроме того, я очень люблю формат Rtf и стараюсь, по-возможности, делать копии своих документов в этом формате. Но вот из Internet'а я скачал 50 файлов с интересующей меня информацией — скажем, рефератов по актуальным вопросам кардиологии. И все они были набраны разными людьми в соответствии с предпочтениями каждого: везде разный шрифт, разные размеры шрифта, отступы абзацев — все вкривь и вкось, выравнивание — то влево, то по ширине. В общем, работы по приведению в приемлемый вид — куча. (Для тех, кто является решительным противником однообразия оформления своих документов, приведу другую ситуацию: Вы являетесь организатором конференции, на которую все заинтересованные лица прислали свои доклады, и Вам надо привести их в однообразный вид для помещения в Internet, например, или для последующей отдельной распечатки каждого доклада.)

Можно, конечно, повозиться с каждым документом: открывать, ставить нужный шрифт, отступы, сохранять в формате Word, потом Rtf… Если документов — два, да даже десять, то еще как-то можно справиться, а если их сорок или сто? И вот тут-то придут на помощь макросы.

Но как можно написать программу, да-да, настоящую программу на настоящем языке программирования, ничего не зная о нем, кроме того, что он существует? Это действительно было бы очень трудно сделать на С++ или даже Delphi. Но для написания программ на VBA не надо особых знаний — они появятся в процессе работы. Важно лишь уметь думать.

Итак, начинаем.

Вначале я определился, что мне надо сделать с каждым документом. Во-первых, обязательно заменить шрифт на Times New Roman, 12 пунктов. Кроме того, необходимо сделать весь текст одного цвета. Во-вторых, убрать все отступы абзацев. В-третьих, заменить все выравнивание по левому краю выравниванием по ширине. Наконец, нужно обработать все документы, предварительно сохранив каждый в формате Rtf.

Я открыл пару документов из общей кучи и включил запись макроса, согласившись на его имя по умолчанию — все равно потом буду его редактировать. После начала записи макроса я стал обрабатывать документ, а Word скрупулезно переводил мои действия на язык VBA. Выбрал "Правка-Выделить все", выбрал «Формат-Шрифт», поставил шрифт Times New Roman, 12 пунктов, Черный цвет. Выбрал «Формат-Абзац», обнулил все отступы и поставил одинарный межстрочный интервал и красную строку. Затем выбрал «Правка-Заменить», и, указав в графе «Формат-Абзац» для заменяемого — выравнивание влево, а для заменяющего — выравнивание по ширине, а также «Везде» в графе «Направление», провел замену выравниваний во всем тексте (выделенном целиком еще на первом шаге).

После окончания всех этих действий я сохранил документ командой Файл-Сохранить. Затем я выбрал команду Файл-Сохранить в формате Rtf и сохранил документ и в этом формате, после чего закрыл его и выбрал на панели записи макроса кнопку Остановить.

В принципе, назначив записанный макрос какой-нибудь кнопке или сочетанию клавиш, я мог бы на этом остановиться и обработать все документы, открыв их в Word и только нажимая на эту кнопку. Макрос бы просто выполнялся для каждого документа. Но нажимать на кнопку сорок-шестьдесят раз и сидеть около компьютера, ждать, пока все выполнится — не очень приятная перспектива. Хотелось бы, чтобы все было сделано автоматически, а самому пойти выпить кофе или чаю. А вот для этого уже надо записанный макрос отредактировать, предварительно его изучив.

Итак, открываем редактор VBA и, развернув в Менеджере проектов содержимое папки Normal (то есть макросов в шаблоне Normal.dot), выберем модуль NewMacros. Именно в этот модуль попадают все макросы, записанные пользователем. Поскольку записанный нами макрос — первый, то он сразу и откроется.

Вот его содержимое:

Sub Макрос1()

' Макрос1 Макрос

Selection.WholeStory

With Selection.Font

Name = "Times New Roman"

Size = 12

ColorIndex = wdBlack

End With

With Selection.ParagraphFormat

LeftIndent = CentimetersToPoints(0)

RightIndent = CentimetersToPoints(0)

SpaceBefore = 0

SpaceAfter = 0

LineSpacingRule = wdLineSpaceSingle

FirstLineIndent = CentimetersToPoints(1)

End With

Selection.Find.ClearFormatting

Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft

Selection.Find.Replacement.ClearFormatting

Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify

With Selection.Find

Text = ""

Replacement.Text = ""

Forward = True

Wrap = wdFindContinue

Format = True

MatchCase = False

MatchWholeWord = False

MatchWildcards = False

MatchSoundsLike = False

MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

ActiveDocument.Save

ActiveDocument.SaveAs FileName:="Доклад1.rtf", FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False

ActiveWindow.Close

End Sub

Разберем все его строки более подробно.

Sub Макрос1()

' Макрос1 Макрос

Как нетрудно догадаться, это заголовок макроса. Слово "Sub", как уже говорилось, означает начало программы. Название программы — в данном случае "Макрос1" — является уникальным именем, по которому эту программу можно запустить из других программ этого модуля.

Знаки перед строчкой обозначают комментарии — то есть все, что стоит в той же строке после них, никак не влияет на работу программы. В окне редактора VBA все комментарии отображаются зеленым цветом.

Selection.WholeStory

Скорее всего, это — переведенная на язык VBA при записи макроса команда Выделить все. В самом деле, ведь первое действие, выполненное в процессе записи — именно выделение всего текста. Подтвердить это нетрудно, просто поставив курсор на слово «WholeStory» и нажав кнопку вызова помощи F1. Справка языка VBA устроена очень удобно — при ее вызове из редактора VBA она «смотрит», не стоит ли курсор на одном из слов, являющихся командой VBA, и, если курсор стоит именно на таком слове, то выводится справка, относящаяся к этой самой команде (рис. 3.1).



Рис. 3.1. Вот что показывает справка по слову WholeStory


Немножко непонятный текст, но при помощи словаря удастся перевести, что эта команда расширяет выделение на весь текст.


Небольшое отступление

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

Как уже неоднократно упоминалось, язык VBA называется обьектно-ориентированнным. Такое название дано этому языку, как, впрочем, и большому количеству других современных языков программирования, из-за особого строения его команд (более подробно синтаксис VBA был описан во второй главе). Типичная команда Visual Basic имеет такой вид: <Обьект>.<Обьект, входящий в первый обьект>.<…>.<Тот обьект, с которым нужно произвести действие>.<Собственно действие>. Иными словами, каждая команда пишется как бы "с конца": вначале определяется то, над чем надо произвести действие — обьект, а затем само действие — метод. Разделителями компонентов команды служат точки. Вот пример такой команды:

Selection.Font.Size = 12

Эта команда устанавливает размер шрифта во всем выделенном тексте в 12 пунктов. У обьекта Selection (то есть выделенная в данный момент часть текста) есть подобьект Font — шрифт выделенного текста, а у подобьекта Font — свойство Size. Свойство Size тоже можно считать подобьектом. Знак "=" — это оператор присваивания, в данном случае свойству Size обьекта Font обьекта Selection присваивается значение 12 — размер шрифта во всем выделенном тексте устанавливается в 12 пунктов.

Если в документе ничего не выделено, то в 12 пунктов устанавливается размер текущего шрифта и следующая набранная буква будет именно такого размера. Если выделен графический обьект, то команда будет ошибочной, о чем VBA выдаст соответствующее сообщение.

Кроме того, с помощью подобной команды можно получить информацию о текущем размере шрифта:

а = Selection.Font.Size

После ее выполнения переменная а будет иметь значение, равное размеру шрифта выделенного текста. Как видите, синтаксис команды подобен ситаксису предыдущей.

Если в документе ничего не выделено, то переменная а будет иметь значение размера шрифта следующего за курсором символа. Если разные части выделенного текста оформлены разными шрифтами, то переменная а будет иметь значение 9999999. Если выделен графический обьект, то команда будет ошибочной, о чем VBA выдаст соответствующее сообщение.

* * *

With Selection.Font

Name = "Times New Roman"

Size = 12

ColorIndex = wdBlack

End With

Похоже, это что-то, связанное со шрифтом. В самом деле, ведь «Font» по-английски значит «шрифт», а «Selection» — «выделение». По слову «Name» можно заключить, что в этой команде устанавливается имя шрифта — "Times New Roman", а слово «Size», наверное, устанавливает его размер.".ColorIndex = wdBlack" — выглядит как команда, устанавливающая цвет шрифта: есть слово «Color» — «цвет» и есть слово «Black» — «черный». Но чтобы не гадать попусту, посмотрим справку VBA — поставим курсор на слово «Selection» и нажмем F1 (рис. 3.2).



Рис. 3.2. Справка по слову "Selection"


Используя англо-русский словарь, можно узнать, что «Selection» означает выделенный текст или точку ввода текста. Посмотрим справку по слову «Font» (рис. 3.3).



Рис. 3.3. Справка по слову "Font"


Что-то маловато информации. Ну, ясно, что шрифт, а как пишется команда, какие у нее могут быть еще параметры? Нажмем-ка на подчеркнутое слово «Font» в тексте — это выведет информацию об обьекте «Font» (рис. 3.4).



Рис. 3.4. Справка об обьекте "Font"


Ну, теперь все ясно. Даже примеры приведены, — и очень похожие на наш макрос. Посмотрим тогда ссылку «Properties» вверху окна справки — список свойств шрифта, которые можно задать в программе (рис. 3.5).



Рис. 3.5. Список свойств обьекта "Font"


Это, кстати, такой же список, как и тот, что выпадает в качестве контекстной подсказки, если при наборе текста программы вручную поставить после слова «Font» точку. Видно, что там есть все свойства шрифта, задаваемые в макросе: и «Name», и «Size», и «ColorIndex». Можно при желании почитать про каждое свойство подробно, но, наверное, лучше разобраться с командой «With», которая встречается и в нашем макросе, и в справке по слову «Font». Ставим на нее курсор и нажимаем F1 (рис. 3.6).



Рис. 3.6. Справка по слову "With"


Даже на русском (некоторые разделы справки VBA переведены на русский язык). Ну и прекрасно — прочтя справку, узнаем, что "Инструкция With позволяет выполнить последовательность инструкций над указанным объектом, не повторяя задание имени объекта." То есть она позволяет сократить обьем кода и облегчить ориентировку программиста в нем, — иначе, без этой функции, рассматриваемый фрагмент кода нашего макроса имел бы вид

Selection.Font.Name = "Times New Roman"

Selection.Font.Size = 12

Selection.Font.ColorIndex = wdBlack

что и выглядит некрасиво, и места больше требует. Примем к сведению.

Идем дальше:

With Selection.ParagraphFormat

LeftIndent = CentimetersToPoints(0)

RightIndent = CentimetersToPoints(0)

SpaceBefore = 0

SpaceAfter = 0

LineSpacingRule = wdLineSpaceSingle

FirstLineIndent = CentimetersToPoints(1.27)

End With

Это — команда установки параметров выделенных абзацев: отступов, межстрочного интервала, красной строки. Нетрудно получить эту информацию из справки или просто догадаться, — ведь «Paragraph» означает «абзац».

Впрочем, проверим — так ли это. Откроем какой-либо документ и запишем новый макрос — выделив пару абзацев, включим запись макроса и поставим этим двум абзацам отступы сверху, снизу, справа и слева по одному сантиметру, а межстрочный интервал — полуторный. Вот что получилось:

Sub Макрос2()

' Макрос записан 26.01.00

With Selection.ParagraphFormat

LeftIndent = CentimetersToPoints(1)

RightIndent = CentimetersToPoints(1)

SpaceBefore = 1

SpaceAfter = 1

LineSpacingRule = wdLineSpace1pt5

Alignment = wdAlignParagraphJustify

WidowControl = True

KeepWithNext = False

KeepTogether = False

PageBreakBefore = False

NoLineNumber = False

Hyphenation = True

FirstLineIndent = CentimetersToPoints(1)

OutlineLevel = wdOutlineLevelBodyText

End With

End Sub

Что-то не то! Код какой-то большой и много новых команд, которых не было записано в первый раз! Какие-то".WidowControl", ".KeepWithNext"… Впрочем, ясно, что это свойства абзаца — наверное, "Контроль висячих строк", "Не отрывать от следующего". Но почему же в первый раз записанный код был гораздо меньше, и все было "по делу"?

Сравним оба случая. В прошлый раз все абзацы в документе были оформлены по-разному, а в этот раз оформление обоих абзацев было одинаковым. Может, в этом дело? И действительно, поэкспериментировав еще (уж не буду здесь приводить все тексты), позаписывав макросы при оформлении разнооформленных абзацев и одинаково оформленных, можно прийти к выводу, что в текст записанного макроса попадают те свойства, которые после установки параметров абзацев через диалоговое окно "Формат"-"Абзац" оказываются одинаковыми у всех обрабатываемых абзацев! И неважно, были ли эти свойства установлены такими именно сейчас, или когда-то ранее.


Небольшое отступление

Средство записи макросов VBA отслеживает не столько действия пользователя, сколько изменения параметров текста. Поэтому при задании свойств абзаца с помощью соответствующего диалогового окна "Формат"-"Абзац" оно скрупулезно записывает в макрос все параметры этого диалогового окна, которые в нем были заданы при нажатии кнопки Ok. Если абзацы имели разное оформление, которое не было изменено в данный момент на единообразное, то те пункты данного диалогового окна, которые остались различными у разных абзацев в выделении, будут иметь неопределенное значение, и средство записи макросов не сможет их поместить в текст записываемого макроса. В самом же диалоговом окне подобные неопределенные опции отображаются галочкой на сером фоне, а в полях указания размеров отступов не стоят их значения.

Если же все выделенные абзацы были оформлены единообразно, то все значения диалогового окна "Формат"-"Абзац" будут определены, и все они попадут в текст макроса.

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

Если при вызове диалогового окна параметров текста или шрифта во время записи макроса в документе ничего не было выделено, то будут определены все параметры диалогового окна, и в макрос попадут все свойства, могущие быть указанными в окне. Установленные параметры будут использоваться для вновь набираемого текста.

Параметры таких диалоговых окон, как "Файл"-"Параметры страницы" или "Файл"-"Печать" определены полностью всегда, и поэтому при записи макроса в его текст будут записываться все возможные параметры этих диалоговых окон, вне зависимости от того, были ли изменены они все или изменению подверглись лишь некоторые.

* * *

Идем дальше.

Selection.Find.ClearFormatting

Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft

Selection.Find.Replacement.ClearFormatting

Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify

With Selection.Find

Text = ""

Replacement.Text = ""

Forward = True

Wrap = wdFindContinue

Format = True

MatchCase = False

MatchWholeWord = False

MatchWildcards = False

MatchSoundsLike = False

MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

Насколько помнится, при записи макроса мы вызывали функцию замены Word для изменения всего выравнивания абзацев по левому краю на выравнивание по ширине. И вот перед нами эта функция, вызов которой записан на языке VBA. По всей видимости, строчка "Selection.Find.ClearFormatting" означает очищение параметров форматирования в окне замены — эквивалент нажатию кнопки "Снять форматирование", а фразы "Selection.Find.ParagraphFormat.Alignment = wdAlign ParagraphLeft" и "Selection.Find.Replacement.Paragraph Format.Alignment = wdAlignParagraphJustify" — установка параметров того, что надо искать — выравнивания «Left» (то есть по левому краю) и того, на что надо заменять — выравнивания «Justify» (по ширине). Нетрудно было догадаться — просто переведя с английского языка значения слов, входящих в команды: «Selection» — выделение, "Find.Replacement" — найти и заменить, «ParagraphFormat» — формат абзаца, «Alignment» — выравнивание, "AlignParagraphJustify" — «РавнятьАбзацПоШирине». Что ж, ясно. Оператор «With» нам уже знаком — в следующим за разобранными нами строчками фрагменте речь пойдет об окне "Найти и заменить".

Легко сообразить, что все параметры обьекта "Selection.Find" (то есть поиска в выделенной части текста или во всем тексте) соответствуют параметрам окна "Найти и заменить": ".MatchWholeWord" — "искать целое слово", ".MatchCase" — "учитывать регистр".".Text" — здесь, наверное, надо указать заменяемый текст, а".Replacement.Text" — здесь то, на что заменить. В нашем случае заменять надо не текст, а форматирование, поэтому эти строчки пусты.

Заметив повторения слов "Selection.Find" в первых четырех строчках, можно посчитать, что и их содержимое можно включить в блок оператора «With». Проверим-ка это. Чуть ниже последнего записанного нами макроса напишем строчку: "Sub experience1()" (имя после «Sub» может быть любым, важно лишь, чтобы оно не совпадало с какой-либо командой VBA). Нажмем Ввод — парой строчек ниже редактор VBA напишет: "End Sub". С помощью команд «Копировать» и «Вставить» скопируем из нашей программы в текст нового макроса блок "With Selection.Find". А затем переместим все строчки, относящиеся к отражению в макросе работы окна "Найти и заменить" в блок "With Selection.Find", убрав слова "Selection.Find":

Sub experience1()

With Selection.Find

ClearFormatting

ParagraphFormat.Alignment = wdAlignParagraphLeft

Replacement.ClearFormatting

Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify

Text = ""

Replacement.Text = ""

Forward = True

Wrap = wdFindContinue

Format = True

MatchCase = False

MatchWholeWord = False

MatchWildcards = False

MatchSoundsLike = False

MatchAllWordForms = False

Execute Replace:=wdReplaceAll

End With

End Sub

Попробуем программу в деле. Откроем еще один документ из общего набора и запустим клавишей F5 новый макрос на выполнение (курсор должен стоять внутри текста запускаемого макроса). Все прекрасно! Замена произошла так, как необходимо. Значит, ясно — так сокращать текст программы можно.

Осталось еще несколько интересных строчек, конкретное значение которых может вызвать вопросы — ".Forward = True", ".Wrap = wdFindContinue", ".Execute Replace:=wdReplaceAll". Ну, первая — это направление поиска — вперед или назад (тогда бы там было значение "False"). Но что значит вторая? А запишем-ка для выяснения еще макрос с такой же заменой выравнивания влево на выравнивание по ширине, но с разными параметрами направления поиска. Вот что получилось:



Видно, что наличие или отсутствие согласия на продолжение поиска не влияет на записываемый текст. А как же тогда отказаться от запроса на продолжение? Откроем текст макроса и поставим после команды".Wrap" еще один знак "=" (рис. 3.7).



Ну вот, все и ясно — для отказа от продолжения замены после достижения конца документа нужно поставить значение параметра".Wrap" как «wdFindStop». То есть вышеприведенная таблица должна иметь вид



Осталось разобраться со строчкой".Execute Replace:= wdReplaceAll". По логике вещей, это должна быть команда запуска поиска, тем более что и слово «Execute» означает «Запустить». Посмотрим в справке — по слову «Execute». Так, четыре ссылки: "For information about the Execute method, click one of the following object names: Dialog, Find, KeyBinding, MailMerge". Нас интересует вторая — «Find», так как мы работаем именно с этим обьектом. Открываем…

Так и есть — команда".Execute" запускает команду поиска и замены на выполнение: "Runs the specified find operation. Returns True if the find operation is successful.". Из текста справки также узнаем, что все параметры поиска и замены можно было бы задать и в скобках, а, кроме того, результат выполнения команды можно записать в переменную — успешен ли был поиск или нет (то есть были ли найдены в данном сеансе работы команды "Найти и заменить" искомые элементы). Сейчас данная возможность не требуется, однако запомнить ее стоит — мало ли когда пригодится.

Продолжаем изучать записанную макрокоманду.

ActiveDocument.Save

Вопросов не вызывает — это команда сохранения активного документа.

ActiveDocument.SaveAs FileName:="Доклад1.rtf", FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False

А вот здесь уже понадобится редактирование. Это команда "Сохранить Как…" — поскольку соответствующая команда Word представляет собой диалоговое окно, то в текст макроса помещаются все возможные параметры, как соответствующие установленным по умолчанию, так и нет: «AddToRecentFiles» — добавлять ли ярлык в папку «Recent», «EmbedTrueTypeFonts» — внедрять ли шрифты TrueType. Наиболее интересны элементы "FileName:="Доклад1.rtf"" и "FileFormat:=wdFormatRTF" — имя файла, под которым сохраняется активный документ, и тип сохраняемого файла. Тип нас устраивает — формат Rtf. А вот как быть с именем? Ведь у каждого файла должно быть свое, уникальное имя. Попробуем для начала просто исключить строчку с указанием имени из текста данной команды. Создадим еще один модуль, скопируем туда всю команду "ActiveDocument.SaveAs" со всеми параметрами и удалим строчку "FileName:="Доклад1.rtf"". Запустим программу… ничего не произошло. Но ведь программа что-то делала: и жесткий диск работал, и система была недоступна пару секунд, и сообщений об ошибках не было… Что же все же сработало? А откроем-ка в «Блокноте» или другом редакторе простого текста файл, который сохранялся — у меня это был файл "Доклад2.doc", предварительно выгрузив его из Word (рис. 3.8).



Рис. 3.8. Откроем в «Блокноте» файл, который сохранялся нашей командой


Так вот в чем дело — файл был сохранен в формате Rtf, но под прежним именем и с расширением".doc"! Но нас это не устраивает — имя пусть будет то же, а вот расширение должно быть именно".rtf".

Интересно, а что будет, если запустить эту программу при активном ни разу не сохранявшемся документе? Запускаем… Активный документ приобрел имя "Doc1.doc" (ну, или "Doc2.doc", "Doc3.doc" — у кого как). Но где он сохранился? Ищем по F3 в Explorere — так, сохранен он в папке, где произошло последнее ручное сохранение какого-либо файла или в папке для документов Word по умолчанию.[3]

Следовательно, при программном сохранении ранее несохранявшегося документа без задания ему имени и места сохранения (место сохранения можно задать, включив в имя документа в пункте «FileName» полный путь к его новому местоположению) происходит сохранение активного документа в папке по умолчанию (или в папке, где был последний раз сохранен вручную какой-нибудь документ) и с именем по умолчанию. Примем к сведению.

Но как же нам быть с нашей программой? Нам ведь надо, чтобы все обрабатываемые файлы сохранялись под своим именем и в формате и с расширением Rtf! А попробуем-ка каким-нибудь способом получить программно имя активного документа. Создадим еще один макрос, и напишем там «ActiveDocument», ставим точку (рис. 3.9) и видим, что среди возможных продолжений команды есть свойство "Name".



Рис. 3.9. А так можно найти нужное продолжение команды.


Похоже, это и есть то, что нам надо. Проверим. Модифицируем экспериментальную процедуру следующим образом:

Sub experience2()

MsgBox ActiveDocument.Name

End Su

Это позволит нам вызвать окно сообщения с значением функции "ActiveDocument.Name". Можно было бы написать "Debug.Print ActiveDocument.Name", что отобразило бы значение этой функции в специальном Окне отладки (вызывается из меню редактора VBA "Вид"-"Окно отладки"). Но использовать окно сообщения как-то привычнее. Итак, нажимаем F5… получаем окно с сообщением: "Доклад1.doc".

Но нам ведь нужно одно только имя, без расширения! Как же его получить? Наверное, проще всего убрать последние четыре символа — ".doc". Но как?

Воспользуемся справкой. Нажмем F1 в редакторе VBA, в открывшемся окне нажмем кнопку «Разделы», а там — "Предметный указатель", — в нем все разделы справки классифицированы по смыслу, в то время как в разделе «Поиск» лишь составлена база данных по всем словам, входящим в справочную систему VBA.

Наберем в строке поиска слово «строка». Из списка разделов справочной системы VBA выберем то, что нам надо — строчку "крайние левые символы" (ведь нам нужно получить из имени документа с расширением только его имя, то есть левую часть строки без четырех правых символов, то есть крайние слева символы). Получаем справку по функции «Left» (рис. 3.10).



Рис. 3.10. Справка по функции Left.


Превосходно — функция «Left» является именно той функцией, которая нам требовалась. Но она требует значение количества символов во всей строке — как это узнать? Да так, как описано в данном справочном окне в разделе "Дополнительные сведения" — через функцию «Len». Нажмем ссылку "См. также", выберем из списка строчку "Функция Len" и изучим появившуюся информацию.[4]

Немного подумав и использовав данные о синтаксисе обеих команд в справке, можно написать команду, которая возвращает строку без последних четырех символов:

imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4)

Можно проверить. Создадим еще один модуль:

Sub experience3()

imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4)

MsgBox imyadoc

End Sub

и запустим его. В окне сообщения — имя документа без расширения. Все так, как нам необходимо.


Небольшое отступление

Вышеизложенный способ получения имени активного документа без расширения — не самый лучший, хотя имеет право на существование. Есть еще один способ узнать только имя документа, унаследованный из предыдущих версий Word, — в Word 6.0 и Word 95 была специальная команда для получения имени документа, к сожалению, в VBA не включенная. Однако она может быть использована в VBA, так как макросы для Word 6.0 и Word 95 могут выполняться и в более новых версиях Office. При открытии в Office 97/2000/XP шаблонов с макросами, созданных в предыдущих версиях Office, все макросы автоматически конвертируются для выполнения в VBA с помощью включенной в него версии языка WordBasic, на котором писались макрокоманды для Word 6.0 и Word 95.

В Word 6.0 и Word 95 имелась функция "FileNameInfo$(документ, параметр)", с помощью которой можно было получить имя документа без расширения, путь к документу без имени и путь к документу вместе с именем. Для того, чтобы узнать одно имя документа, без расширения и пути, значение параметра должно быть равно 4. (Все это подробно описано в справке по WordBasic для Microsoft Word 6.0 и Microsoft Word 95.)

В VBA эта функция будет выглядеть так:

imyadoc = WordBasic.[FileNameInfo$](ActiveDocument.Name, 4)

Она возвращает полное имя документа без расширения и пути.

Данная функция просто незаменима при обработке документов с расширениями, состоящими не из трех символов — например, ".html". В то время как в таких случаях с помощью функций «Len», «Mid», «Right» пришлось бы писать огромные фрагменты кода для получения имени документа без расширения, эта функция позволит получить его одной строчкой.

Однако при первой работе с VBA она не будет очевидной, так как узнать о ней, и тем более о ее необходимых параметрах может только тот, кто раньше имел дело с WordBasic. Поэтому в нашей программе будет использоваться предыдущая функция — "imyadoc = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4)".

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

* * *

Итак, команда нашей программы "ActiveDocument.SaveAs" должна выглядеть так:

ActiveDocument.SaveAs FileName: = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF, LockComments:=False, Password:="", AddToRecentFiles:=True, WritePassword:="", ReadOnlyRecommended:=False, EmbedTrueTypeFonts:=False, SaveNativePictureFormat:=False, SaveFormsData:=False, SaveAsAOCELetter:= False

Все лишнее можно убрать, хотя это не обязательно:

ActiveDocument.SaveAs FileName: = Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF

Не мешало бы еще, чтобы новый документ в формате Rtf сохранялся в той же папке, что и исходный. Для этого добавим к параметру «FileName» информацию о пути к активному документу:

ActiveDocument.SaveAs FileName:=ActiveDocument.Path + "\" + Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF

Иначе Word будет сохранять документы в той папке, где последний раз был сохранен или открыт како-нибудь документ с помощью диалоговых окон "Сохранить как…" и "Открыть…". А это все же не всегда будет той же самой папкой, где находятся обрабатываемые документы, — к тому же документы для обработки можно открывать в Word и путем перетаскивания иконки файла в окно редактора, а при таком способе открытия папка сохранения документов не меняется.

И, наконец, последняя строчка:

ActiveWindow.Close

End Sub


Вот и конец программы — закрытие активного окна с документом.

Ну, а теперь надо добиться того, чтобы программа могла обрабатывать не один документ, а сразу множество. Можно пойти двумя путями: либо обрабатывать все нужные документы в одной папке, либо обработать все открытые документы, предварительно открыв нужные. Лично я предпочел второй вариант: ведь тогда можно открыть для обработки все действительно необходимые документы, несмотря на их исходное расположение — пусть даже и не в одной папке.

Как это сделать? Заметим, что готовый документ закрывается после обработки, и в окне Word активизируется следующий документ из всех открытых в редакторе. Следовательно, во-первых, надо обеспечить выполнение макроса над всеми документами, то есть его повторение — после окончания работы макроса он должен быть выполнен сначала. Можно считать, что в момент обработки в окне Word будут открыты лишь те документы, которые обработать надо — лишние всегда можно закрыть, а если так уж необходимо оставить их открытыми, то ничего не мешает открыть для обработки файлов новое окно Word. Для выполнения макроса сначала нужно заставить VBA перейти в начало программы. Поищем в справке VBA, в Предметном указателе по слову «переход» — есть ли какая команда для этого? Получаем список — «безусловные», "при ошибке", "условные".[5]

Выберем «Безусловные» — ведь в нашей программе надо обязательно перейти к обработке следующего документа. Получаем выбор из двух функций — выберем вторую, название короче — наверняка ее использование проще.

Из справки и примера узнаем, что инструкция (то есть функция, которая не возвращает никаких значений) «Goto» указывает на необходимость перехода к строке, на которой находится установленная нами метка. Поставим метку[6] в начало нашей программы:

Sub Макрос1()

' Макрос1 Макрос

metka:

Selection.WholeStory

With Selection.Font

Name = "Times New Roman"

… … … …


а в ее конец — инструкцию "Goto":


… … … …

ActiveDocument.SaveAs FileName:=ActiveDocument.Path + "\" + Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF

ActiveWindow.Close

Goto metka

End Sub

Готово. Теперь наша программа обработает все открытые документы. Но… обработать-то обработала, но в конце выдала сообщение об ошибке. Можно, конечно, оставить и так, но программа, заканчивающая свою работу ошибкой, пусть и после выполнения всех необходимых действий, выглядит некрасиво. Поэтому нужно обеспечить остановку выполнения программы после того, как будут обработаны все документы. Итак, алгоритм действий программы должен быть таков:

1. Выполнить обработку активного документа, сохранить его и закрыть.

2. Посмотреть, есть ли еще открытые документы.

3. Если есть, то перейти к пункту 1, если нет, то завершить работу.

"Если" — по-английски «If». Поищем по этому слову в Предметном указателе справки. Получаем строчку: "Инструкция If", выбрав которую, получаем окно из различных сочетаний слов If, Then, Else и др.[7]

Выберем "Инструкция If…Then…Else" — вроде первое слово понятнее. Получаем справку, из которой узнаем синтаксис команды:

If условие Then [инструкции] [Else инструкции_else]

Какое же условие должно быть у нас? Наверное, подсчет количества открытых документов — если не 0, то продолжать работу, а если 0, то остановиться. А как можно подсчитать количество открытых документов? Посмотрим, нет ли в VBA команды для такого подсчета? Напишем в тексте программы: «Documents», поставим точку и просмотрим выпавший список. Так и есть — в списке имеется метод «Count»: скорее всего, это функция подсчета. Выберем ее из списка и посмотрим по ней справку и пример — да, эта команда считает открытые документы. То есть условие должно выглядеть как "If Documents.Count > 0 Then … ". Ну, а инструкции — переход к метке — нами уже написаны.

Часть команды "Else …" можно опустить, а просто написать нужные инструкции после команды "If…" — ведь все равно к их выполнению программа не перейдет до тех пор, пока останутся открытые документы. А поместить там, наверное, стоит вызов сообщения, желательно со звуковым сигналом, — чтобы можно было поставить документы на обработку и отойти. Используем функцию MsgBox (о ее синтаксисе подробно написано в справке):

signal = MsgBox("Обработка закончена", vbInformation, "Обработка текстов")

Итак, программа готова. Можно с помощью диалогового окна «Настройка» назначить ей кнопку, пункт меню или сочетание клавиш, и запускать ее при необходимости.

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

Опять воспользуемся Справкой. В Предметном указателе зададим слова "dialog boxes", выберем эту же строчку из списка тем. В появившемся окне выбора выберем второе — "Displaying Built-In Word Dialog-Boxes", так как это, судя по названию, более общая тема, чем список аргументов диалоговых окон. Читаем… В переводе текст справки означает, что с помощью команды Dialogs("имя диалога"). Show можно вызвать на экран любое встроенное диалоговое окно Word, вроде окна открытия файла или сохранения в папке. Попробуем найти окно, которое возвращало бы путь к какой-нибудь директории. Для этого создадим очередной экспериментальный модуль и будем перебирать в нем все возможные имена диалоговых окон (рис. 3.11).



Рис. 3.11. Для поиска нужной команды можно перебрать список встроенных диалоговых окон Word.


В качестве метода вывода окна на экран установим".Display" — вывод окна на экран без каких-либо последующих действий: если с помощью команды Dialogs(wdDialogFileOpen). Show будет выведено окно открытия файла, то при нажатии кнопки «Открыть» в нем выбранный в окне файл будет открыт, а если окно выводилось командой Dialogs(wdDialogFileOpen). Display, то открытия файла не произойдет, но имя выбранного файла можно будет записать в переменную:

With Dialogs(wdDialogFileOpen)

Display

imya=.Name

End With

и впоследствии использовать это имя по своему усмотрению.

При использовании встроенных диалоговых окон Word обязательно использование оператора With, так как, казалось бы, эквивалентный фрагмент кода

Dialogs(wdDialogFileOpen). Display

imya=Dialogs(wdDialogFileOpen). Name

работать не будет.

После перебора остановимся на окне Dialogs(wdDialogCopyFile) — копирование файла. Посмотрев ссылку "Built-in dialog box argument lists" окна "Displaying built-in Word dialog boxes", получаем список всех возможных аргументов диалоговых окон (то есть параметров, значения которых можно получить из окон или задать им). Нас интересует параметр «Directory» (папка, куда скопируется файл, указанный в параметре «FileName» при выполнении метода «Show» или «Execute» — при выполнении последнего метода происходит задание или получение необходимой информации из параметров диалогового окна без отображения собственно диалога). Поэкспериментируем с этим окном — напишем в экспериментальном модуле следующий код:

Sub experience4()

With Dialogs(wdDialogCopyFile)

Display

papka =.Directory

End With

MsgBox papka

End Sub

Запустив эту программу несколько раз, получаем, что в переменную «papka» записывается путь и имя папки, но, если в пути или имени были пробелы, то путь окаймляется кавычками: "C: \Program Files\Microsoft Office\Шаблоны\", а если пробелов в пути не было, то кавычки по краям не ставятся. Поэтому возвращаемую переменную нужно обработать — убрать кавычки. Сделать это можно с помощью уже известных нам команд «Left», «Rigth», «Mid» и "Len":

If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2)

"Chr$(34)" — это команда, которая возвращает символ с ASCII-кодом 34: кавычку. (Каждый символ в Dos и Windows имеет свой номер — ASCII-код, по которому его можно вызвать на экран. Узнать код выделенного символа можно командой "MsgBox Asc(Selection.Text)". Узнать о командах "Chr$" и «Asc» можно, порывшись в справке.)

Кроме того, не мешало бы сделать так, чтобы при запуске программы окно "Копирование файла" по умолчанию стояло бы на директории с активным документом — не всегда же нужно сохранять все обрабатываемые документы в отдельной папке! Нет ничего проще — установим параметр «Directory» как "ActiveDocument.Name" перед командой".Display":

With Dialogs(wdDialogCopyFile)

Directory = ActiveDocument.Path

Display

papka =.Directory

End With

If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2)

Это и есть необходимый код для отображения диалогового окна и получения пути к папке для сохранения обработанных документов. Наконец, сделаем так, чтобы нажатие кнопки «Отмена» в диалоговом окне приводило бы не к простому продолжению работы программы, а к выходу из нее. Для этого в справке по слову".Display" узнаем, что эта команда является функцией — то есть возвращает определенное значение, в зависимости от того, какая кнопка была нажата. Добавим в программу условие и команду выхода из программы:

With Dialogs(wdDialogCopyFile)

Directory = ActiveDocument.Path

If.Display = 0 Then Exit Sub

papka =.Directory

End With

If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2)

Теперь при нажатии кнопки «Отмена» в диалоговом окне выбора папки произойдет выход из программы.

Окончательный вид нашего макроса:

Sub Макрос1()

' Программа для обработки документов

With Dialogs(wdDialogCopyFile)

Directory = ActiveDocument.Path

If.Display = 0 Then Exit Sub

papka =.Directory

End With

If Right(papka, 1) = Chr$(34) Then papka = Mid(papka, 2, Len(papka) — 2)

metka:

Selection.WholeStory

With Selection.Font

Name = "Times New Roman"

Size = 12

ColorIndex = wdBlack

End With

With Selection.ParagraphFormat

LeftIndent = CentimetersToPoints(0)

RightIndent = CentimetersToPoints(0)

SpaceBefore = 0

SpaceAfter = 0

LineSpacingRule = wdLineSpaceSingle

FirstLineIndent = CentimetersToPoints(1.27)

End With

Selection.Find.ClearFormatting

Selection.Find.ParagraphFormat.Alignment = wdAlignParagraphLeft

Selection.Find.Replacement.ClearFormatting

Selection.Find.Replacement.ParagraphFormat.Alignment = wdAlignParagraphJustify

With Selection.Find

Text = ""

Replacement.Text = ""

Forward = True

Wrap = wdFindContinue

Format = True

MatchCase = False

MatchWholeWord = False

MatchWildcards = False

MatchSoundsLike = False

MatchAllWordForms = False

End With

Selection.Find.Execute Replace:=wdReplaceAll

ActiveDocument.Save

ActiveDocument.SaveAs FileName:=papka + Left(ActiveDocument.Name, Len(ActiveDocument.Name) — 4), FileFormat:=wdFormatRTF

ActiveWindow.Close

If Documents.Count > 0 Then GoTo metka

signal = MsgBox("Обработка закончена", vbInformation, "Обработка текстов")

End Sub

* * *

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

А эти приемы таковы:

1. Для самого первого начала работы, а также для выяснения, какая команда соответствует тому или иному преобразованию текста или другому действию пользователя Word, необходимо широко использовать основное отличие редактора VBA от редакторов других языков программирования — средство записи макросов. Наличие средства записи макросов позволяет быстро и легко создать свою первую программу и начать ее изучать, а также может оказать серьезную помощь, когда необходимо «перевести» на язык VBA какое-либо действие пользователя Word.

2. Для грамотного написания кода, выяснения возможных продолжений каждой команды следует широко использовать контекстную подсказку VBA, которая появляется при наборе точки или скобки после уже написанной части команды.

3. Справка VBA — основной источник знаний по этому языку! Она построена по контекстному принципу — при вызове справки клавишей F1 отображается справка по той команде, на которой стоит в это время курсор. Таким образом можно быстро и легко изучить назначение, синтаксис и особенности каждой команды — стоит только набрать ее и вызвать справку. К сожалению, многие разделы справки не переведены на русский язык, поэтому англо-русский словарь (или система машинного перевода) может стать вашим спутником на время освоения VBA. Путешествия по справке и чтение различных ее разделов, даже не относящихся к непосредственно выполняемой задаче, обогатит Ваши знания по программированию в Word и не только…

4. Примеры справки VBA — работа, сделанная за вас! Копируйте фрагменты кода из примеров себе в программу и модифицируйте их так, как вам надо.

5. Для тестирования и отладки небольшого фрагмента кода или даже одной команды вынесите ее временно в отдельный модуль — проще будет работать.

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

Visual Basic for Applications, пожалуй, на настоящее время единственный язык, который можно изучить абсолютно самостоятельно, без каких-либо дополнительных книг или текстов программ, достаточно лишь иметь "научный взгляд на мир", то есть способность наблюдать, экспериментировать и делать выводы. Даже эти главы имеют цель не столько научить вас программировать на VBA, сколько помочь вам начать учиться, чтобы вы не тратили множество времени на поиск и получение информации о не совсем очевидных вещах. Ведь, согласитесь, совсем неплохо облегчить вам начало работы и знакомство с возможностями редактора, немного проиллюстрировав процесс программирования.


Автогонки в Excel 2000

Если в программе Microsoft Excel 97 имеется встроенная игра-"леталка", то в следующей версии этой программы работы с электронными таблицами присутствуют даже настоящие автогонки! Так что не стоит удивляться большим размерам программ от Microsoft, — каждая из таких программ умеет многое, в том числе и играть.


Автогонки из Excel 2000


Как же добраться до этой автотрассы?

Запустите Excel 2000 и создайте новую книгу с помощью команды «Создать» из меню «Файл». Затем сохраните эту книгу как web-страницу с помощью соответствующей команды (т. е. "Сохранить как Web-страницу") того же меню, при этом в диалоговом окне сохранения установите в разделе «Сохранить» отметку в пункте "выделенное: Лист" и поставьте галочку в пункте "Добавить интерактивность". Откройте полученную страницу в браузере Microsoft Internet Explorer, во внедренном в нее листе Excel перейдите с помощью клавиши PageDown к строке 2000, а с помощью линейки горизонтальной прокрутки — к столбцу WC. Выделите строку 2000 (просто нажав мышью на ее номер в указателе номеров строк слева листа) и с помощью клавиши Tab переведите выделение на ячейку WC2000. После этого, нажав одновременно левые клавиши Ctrl, Alt и Shift, кликните левой кнопкой мыши на эмблеме Office в левом верхнем углу внедренного в web-страницу листа Excel. Вот вы и на трассе…

Ехать вперед — клавиша "стрелка вверх", тормозить — "стрелка вниз", поворачивать — соответственно стрелки вправо и влево. Включить фары — клавиша «о» (латинская), пробел — стрелять и уничтожать машины соперников. Соприкосновение с обочиной означает проигрыш: аварию автомобиля. На трассе чередуются ночь и день, — ночью освещение дороги дают только фары. На асфальте написаны имена разработчиков Excel'а.

Поскольку игра базируется не только на Excel'е, но и на средствах сопряжения этой программы с web-страницей, в том случае, если игра у вас не запускается, проследите, чтобы на компьютере были установлены Microsoft Web Components (компонент Office 2000) и в том случае, если они отсутствуют, установите их из дистрибутива Office.

К сожалению, в Excel XP ни автогонки, ни «леталка» не присутствуют. Однако наверняка в скором времени можно будет услышать, как в этой программе запустить какую-нибудь Free Space или еще что почище…

Глава 4. Пусть программа с вами говорит…

Продолжим изучение программирования на Visual Basic for Applications (напомним — сокращенно VBA). Подробные описания теперь уже не нужны — достаточно лишь заострения внимания на некоторых "подводных камнях" или скрытых возможностях.

В этой главе речь пойдет о так называемых "пользовательских формах". Формально они являются "нестандартными диалоговыми окнами" макросов, наподобие диалоговых окон Word, но по сути с их помощью можно создавать настоящие программы, подобные компилируемым программам для Windows, которые будут отличаться от них лишь тем, что для их работы необходим Microsoft Word. К сожалению, формы нельзя создавать с помощью средства записи макросов, но все средства создания форм снабжены подробной справкой, и на ее основе можно довольно быстро научиться работать с формами.

Для создания формы необходимо в любом доступном проекте (шаблоне или документе) из контекстного меню правой кнопки мыши в Менеджере проектов выбрать Вставить-UserForm.

Форма состоит из элементов-различных средств ввода и отображения информации (командных кнопок, мест для ввода текста, мест для вывода текста, переключателей и флажков и др.), которые могут на ней располагаться. У каждого элемента есть свойства-ширина, высота, цвет, особенности внешнего вида и поведения. Более подробно об элементах форм рассказывалось во второй главе.

Основное отличие программного кода, обслуживающего формы, от кода в обычных модулях заключается в принципе программирования. В то время как программа на VBA вроде той, что была нами совместно написана в предыдущей главе, чаще всего выполняется «последовательно», — то есть все ее команды выполняются одна за другой, и их порядок выполнения изменяется лишь в зависимости от операторов условного и безусловного перехода «If» и «Goto», форма "реагирует на события" — то есть каждому элементу формы может быть поставлена в соответствие определенная отдельная программа, выполняющая нужные действия.

Большинство программ для Windows, да и сам текстовый редактор Microsoft Word построены именно по такому принципу, — они не "работают сами по себе", а ждут от пользователя команд и «реагируют» на них: выполняют те или иные действия. Так и форма: программист должен разработать ее интерфейс — создать форму, расположить на ней элементы, определить их свойства, а затем написать "программы обработки событий", поместив в каждой такой программе код, который должен быть выполнен, когда то или иное событие произойдет, то есть будет нажата какая-нибудь кнопка на форме или на клавиатуре, введен текст в поле ввода текста, выбран тот или иной флажок на форме и т. д.

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



Закон Джоуля-Ленца.


Для примера создадим форму, в которой будет производиться подсчет количества теплоты, выделяемой в проводнике при подаче на него разности потенциалов, — пригодится при расчете нагревательных элементов. Согласно соответствующим формулам, Q (количество теплоты в джоулях) = U2 (квадрат величины напряжения в вольтах) * t (время в секундах) / R (сопротивление в омах), при этом R = p (удельное сопротивление материала проводника в омах на метр) * l (длина проводника в метрах) / s (площадь поперечного сечения проводника в квадратных сантиметрах). Таким образом, формула для расчета количества теплоты выглядит так (она также известна под именем закона Джоуля-Ленца): Q=(U2*t*s)/(l*p). Ее мы и запрограммируем в форме.

Сначала создадим саму форму и разработаем ее дизайн. В ней должно быть пять полей для ввода значений, одно поле для вывода значения, и кнопка выхода. Но мы добавим еще кнопку — "Вставить значение в документ": пусть при нажатии этой кнопки подсчитанная информация будет вставлена в текст активного документа. Не мешало бы еще поместить на форме текст о назначении данной программы и краткую инструкцию по ее использованию, а также сделать у формы приличный заголовок (свойство «Caption» элемента "UserForm").

Для помещения на форму элемента управления достаточно перетащить его с "Панели элементов" на форму. Вот что получилось (к примеру) — рис. 4.1.



Рис. 4.1. Форма нашей программы


Поля ввода параметров имеют имена "TextBox1"…"TextBox5" соответственно, поле отображения результата имеет имя «TextBox6», кнопки имеют имена «CommandButton1» и «CommandButton2» сверху вниз соответственно. В элементы "TextBox1"…"TextBox5" пользователь будет вводить текст. Желательно установить свойство Locked элемента «TextBox6» как «True» (рис. 4.2), чтобы не допустить случайного ввода пользователем в него текста — к сбою такой ввод не приведет, но возможность такого ввода может вызвать некоторое недоумение у пользователя.

Разработка дизайна программы — ответственный момент, но не менее важным является обдумывание принципов работы программы. Помните, что исправление ошибки на стадии проектировки программы в несколько раз легче ее исправления на стадии реализации, в десятки раз легче, чем на стадии распространения, и в сотни раз легче, чем на стадии внедрения.



Рис. 4.2. Установка свойства Locked элемента «TextBox6» как "True"


В нашей программе можно сделать, например, так: пользователь вводит все значения, нажимает кнопку «Подсчитать» (надо будет добавить на форму…), и ему в окне результата выдается подсчитанное значение. Но в этом случае, во-первых, пользователь вынужден выполнять лишнее действие — нажатие на кнопку, а, во-вторых, надо будет продумать систему защиты от неправильных действий пользователя: нельзя допускать ввод нулевых или нечисловых значений в поля «TextBox4» и «TextBox5». Для этого придется либо выдавать в таком случае сообщение о неправильном вводе, либо, что представляется более красивым, ставить в эти поля значения по умолчанию, как только пользователь сделает неправильный ввод и уберет курсор с поля ввода. Но… все же, как неудобно! Пользователю надо нажимать лишний раз кнопку, постоянно следить за тем, стоят ли в полях ввода именно нужные значения, а не значения по умолчанию (ведь можно при вводе и случайно задеть соседнюю клавишу), да и при программировании возни будет предостаточно — изволь предусмотреть все случаи, на каждый написать программу обработки именно этого случая… Не слишком ли много проблем? А может быть, надо получше подумать о проектировании программы?

Основной принцип такого проектирования — "сделай проще, но без ущерба функциям". Что нам надо? Чтобы был результат. Когда он возможен? Да когда определены все значения в полях ввода, и при этом два нижних (то есть «TextBox4» и "TextBox5") ненулевые. Так пусть результат в своем окне появляется тогда и только тогда, когда все эти условия выполнены. И пусть программа постоянно отслеживает ввод значений в поля ввода и, как только будут введены все пять значений, и последние два будут ненулевые, а остальные — числовые, отобразит результат. Но есть ли такая возможность у языка VBA? А проверим! Откроем окно программного кода формы (из контекстного меню правой кнопки мыши нашей формы в Менеджере проектов выберем "Программа") и из выпадающего списка в левом верхнем углу (рис. 4.3) выберем, например, «TextBox1».

Так… появился фрагмент кода:

Private Sub TextBox1_Change()

End Sub


Рис. 4.3. Выпадающий список в левом верхнем углу — навигатор по программам элементов формы


"Change" — это по-английски «изменение». Код, написанный в этой части программы (часть эта называется "обработчик события "Change"), должен выполняться всякий раз при происхождении этого события. Можно предположить, что это событие происходит тогда, когда в поле ввода ввели какой-либо символ или удалили его оттуда. В этом случае это — именно то событие, которое нам надо. Но то ли? Проверим. Напишем-ка здесь строчку:

Private Sub TextBox1_Change()

TextBox6.Text=TextBox1.Text

End Sub

Пусть для эксперимента при изменении текста в первом поле ввода произойдет изменение текста в поле отображения результата. Проверим, будет ли это работать, — нажмем F5 (запуск программы на выполнение) и введем текст в первое поле ввода.

Прекрасно — в поле отображения результата появляется тот же текст! Значит, событие «Change» — именно то, которое нам надо использовать в нашей программе, чтобы после каждого нового ввода данных пользователем проверять условия возможности отображения результата и отображать его в случае их выполнения.

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

Проверка возможности подсчета результата и вывод его в случае соблюдения описанных выше условий должна происходить после каждого ввода какого-либо символа в любое из окон ввода, а также при удалении символа из любого окна ввода. Писать пять одинаковых программ для каждого из окон ввода представляется нецелесообразным, поэтому лучше проверку возможности отображения результата и его подсчет вынести в отдельную подпрограмму-процедуру, а из каждого обработчика события «Change» полей ввода ее вызывать.

Переведем на язык VBA условие возможности отображения результата. Во-первых, все значения полей ввода должны быть числовыми. В VBA есть специальная функция для проверки того, является ли та или иная строка записью числа — IsNumeric (можно, например, найти ее описание в разделе «Поиск» справки по VBA из Microsoft Office 97 по словам "строковое выражение числовое значение", а в справке VBA из более старших версий этого пакета — по английским эквивалентам данных слов). Ее и используем. Ну, а для проверки отличия от нуля значений в последних двух полях ввода используем функцию «Val». Итак, результат существует, если

IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0

В этом случае можно осуществить подсчет по формуле Джоуля-Ленца:

rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))

и отобразить его в поле вывода результата:

TextBox6.Text = Str$(rez)

Теперь можно написать процедуру вычисления результата и вызовы ее из всех обработчиков событий "Change":

Private Sub TextBox1_Change()

Scet

End Sub


Private Sub TextBox2_Change()

Scet

End Sub


Private Sub TextBox3_Change()

Scet

End Sub


Private Sub TextBox4_Change()

Scet

End Sub


Private Sub TextBox5_Change()

Scet

End Sub


Private Sub Scet()

If IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 Then

rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))

TextBox6.Text = Str$(rez)

Else

TextBox6.Text = ""

End If

End Sub

В принципе программа уже почти закончена, но стоит еще разобраться с командными кнопками. Для кнопки «Отмена» обработчик события «Click» (то есть нажатия на кнопку) прост — выход из программы:

Private Sub CommandButton2_Click()

Unload Me

End Sub

Но у нас есть еще вторая кнопка — "Вставить результат в документ". А пусть она вставит в документ не просто значение результата, а осмысленную фразу, содержащую как результат, так и введенные параметры! Это можно сделать командой

Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты.»

Она сформирует фразу из значений полей ввода и вставит ее в активный документ. Проверим… так, действительно вставляет, но фраза остается выделенной. А значит, что следующая фраза, выведенная с помощью нашей программы, сотрет предыдущую. Надо посмотреть, нет ли в VBA функции снятия выделения? Посмотрим по выпадающему меню после точки "Selection."… есть команда «Collapse» (то есть "Свернуть"). Из справки по ней узнаем ее синтаксис:

Selection.Collapse Direction:=wdCollapseEnd.

Эта команда убирает выделение и помещает курсор в его конец.

Можно также вставить текст в активный документ "Selection.TypeText Text:="Мой текст" (двоеточие после слова «Text» обязательно, так как это — оператор присваивания значения параметру команды). Тогда в команде специального снятия выделения со вставленного текста не будет необходимости, — после выполнения команды выделенного текста не окажется.

Но что произойдет, если пользователь вдруг вызовет программу тогда, когда открытых документов в Word'е нет? Тогда ведь возникнет ошибка программы. Но этого легко избежать — надо просто проверить перед вставкой, есть ли открытые документы и, если нет, создать новый:

If Documents.Count = 0 Then Documents.Add

Осталась еще одна маленькая деталь. Кнопка "Вставить результат в документ" не должна работать, если результат вычислить нельзя (то есть поле «TextBox6» пусто). Как это сделать?

Среди всего набора возможных свойств элемента «CommandButton» есть свойство «Enabled» — если его установить как «False» (то есть "ложно"), то кнопка будет отображаться серым цветом и не будет реагировать на события (станет неактивной). Это свойство можно задать и программно — командой "CommandButton1.Enabled = False".

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

Вот готовый код нашей программы:

Private Sub CommandButton1_Click()

If Documents.Count = 0 Then Documents.Add

Selection.Text = "При прохождении тока напряжением в " + TextBox1.Text + " вольт по проводнику длиной " + TextBox4.Text + " метров, сечением " + TextBox3.Text + " кв. мм и удельным сопротивлением " + TextBox5.Text + " ом на метр за " + TextBox2.Text + " секунд выделится" + TextBox6.Text + " джоулей теплоты.»

Selection.Collapse Direction:=wdCollapseEnd

End Sub


Private Sub CommandButton2_Click()

Unload Me

End Sub


Private Sub TextBox1_Change()

Scet

End Sub


Private Sub TextBox2_Change()

Scet

End Sub


Private Sub TextBox3_Change()

Scet

End Sub


Private Sub TextBox4_Change()

Scet

End Sub


Private Sub TextBox5_Change()

Scet

End Sub


Private Sub Scet()

If IsNumeric(TextBox1.Text) = True And IsNumeric(TextBox2.Text) = True And IsNumeric(TextBox3.Text) = True And IsNumeric(TextBox4.Text) = True And IsNumeric(TextBox5.Text) = True And Not Val(TextBox4.Text) = 0 And Not Val(TextBox5.Text) = 0 Then

rez = ((Val(TextBox1.Text) ^ 2) * Val(TextBox2.Text) * Val(TextBox3.Text)) / (Val(TextBox4.Text) * Val(TextBox5.Text))

TextBox6.Text = Str$(rez)

CommandButton1.Enabled = True

Else

TextBox6.Text = ""

CommandButton1.Enabled = False

End If

End Sub

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

Назначить форме кнопку или пункт меню для вызова из Word нельзя, — это возможно только для модулей. Поэтому переименуем для красоты форму в «Teplotok», например (свойство «Name» обьекта «UserForm» — можно задать в окне свойств, выделив форму) и напишем модуль, в котором будет всего одна команда — вызов созданной нами формы:

Sub TeploCount()

Teplotok.Show

End Sub

Зададим модулю красивое имя ("Teplo", например, через свойство «Name» обьекта «Модуль1», если модуль для программы вызова формы был вставлен с помощью пункта "Вставить"-"Модуль" контекстного меню правой кнопки мыши в Менеджере проектов) и назначим в Word кнопку для вызова макроса "Normal.Teplo.TeploCount".

Вот и все — наша программа готова! Если вы последовательно выполняли на своем компьютере все приведенные здесь шаги, то можете проверить ее работу. Теперь программу можно вызывать на выполнение соответствующей кнопкой. При желании можно скопировать форму и модуль в отдельный шаблон и создать в нем панель инструментов с кнопкой вызова макроса, — тогда программу можно будет установить и на другие компьютеры, скопировав шаблон с макросом в папку автозагружаемых файлов Word.

Глава 5.Советы и секреты программирования Что такое API?

Для того, чтобы облегчить труд своих коллег и обеспечить всем программам для Windows универсальный интерфейс, программисты Microsoft создали такую вещь, как API — "Application Programming Interface".

Это — набор функций и процедур, которые могут наиболее часто использоваться программами: отображение дерева каталогов, поиск файлов, отображение стандартного окна с кнопками закрытия, минимизации и развертывания на весь экран и многих других. В итоге разработчик, создающий программу для Windows, не должен продумывать и разрабатывать специальные подпрограммы для отображения окна программы, окна для выбора папки и остальных подобных элементарных операций, — ему достаточно просто вызвать из библиотек kernel32.dll или user32.dll, содержащих функции и процедуры API, нужную ему функцию, а она уже все сделает за него сама. Таких функций и процедур много — порядка 600.

В операционной системе MS-DOS такого понятия, как API, не было, — тот, кто брался писать программу для этой операционной системы, обязан был сам, от начала до конца, продумать и реализовать способы выдачи на экран изображения, получения данных от пользователя, путешествия по файловой системе, рисования графики, если таковая возможность была необходимой.[8] Это делало процесс разработки программ с удобным для пользователя интерфейсом весьма трудоемким процессом, зачастую затраты времени и сил на создание приемлемого графического интерфейса программы превосходили затраты на реализацию собственного алгоритма программы, ради которого она и создавалась. Недаром были очень распространены так называемые «консольные» приложения, то есть программы, работающие только из командной строки, без интерфейса, — ввод данных происходил в той же командной строке или производился из указанного в ней файла, а вывод результатов шел в простом текстовом режиме.

С появлением операционной системы Windows каторжный труд программистов по разработке внешнего вида программы и удобных способов ввода и вывода информации резко облегчился, — уже в Windows 3.0 использовались функции API. Теперь программист, если он, например, желал создать окно ввода текста или полосу прокрутки, должен был всего лишь написать вызов функции отображения такого окна с необходимыми ему параметрами, так же, как и любой другой функции языка, на котором он писал свою программу, а не вводить огромные обьемы кода ради создания программы, заново рисующей такое окно или полосу (сознавая при этом, что при разработке следующей программы, в которой тоже будут использоваться такие объекты, ему придется вновь разрабатывать такой код или пытаться частично использовать старый, приспосабливая его к нуждам этой новой программы). Поэтому появление API совершило революционный прорыв в технологии программирования, позволяя создавать нужные программы с привычным удобным интерфейсом гораздо быстрее, не заботясь о таких рутинных деталях, как программирование стандартных объектов интерфейса для ввода и вывода информации.

В языке Visual Basic for Applications (VBA) многие функции и процедуры API вызываются сами при выполнении программы интерпретатором, так что использовать их для отображения окон ввода и вывода текста, рисования на экране геометрических фигур и других простых действий совершенно нет необходимости, — их VBA вызывает по мере надобности, а программе на нем достаточно использовать соответствующие функции этого языка. Однако иногда возникает необходимость в некоторых действиях, для которых либо нет аналогов во встроенных функциях VBA, либо они работают нерационально или слишком медленно. Например, окно выбора папки с изображением дерева каталогов (рис. 5.1) или программа поиска файлов (аналог на функциях VBA — объект "Application.FileSearch" — работает слишком медленно при больших количествах файлов). Для таких случаев в VBA предусмотрена возможность вызова функций API.



Рис. 5.1. Это окно вызывается функцией API.


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

В подавляющем большинстве случаев при программировании для Office можно обойтись без использования API, но иногда только вызов API-функции может привести к достижению нужного результата. Скажем, вам надо обеспечить вызов разных макросов при простом нажатии мышью кнопки на какой-либо панели инструментов Word и в случае одновременного нажатия этой кнопки и клавиши Shift или Control. Вот фрагмент кода, делающего это:

Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal kState As Long) As Integer

Sub Program()

GetAsyncKeyState (vbKeyShift Or vbKeyControl)

If GetAsyncKeyState(vbKeyShift) Then

Call macro1: Exit Sub

ElseIf GetAsyncKeyState(vbKeyControl) Then

Call macro2: Exit Sub

End If

Call macro3

End Sub

Первая строчка — это как бы «резервирование» функции API для использования в программе на VBA. Видно, что вызывается функция GetAsyncKeyState из библиотеки (файла, содержащего программы, предназначенные только для использования другими программами) user32.dll, причем в эту функцию передается номер клавиши, а возвращает она целое число (а именно — 0, если клавиша с соответствующим номером не нажата, и -32767 или 1, если нажата). Любую функцию или процедуру, вызываемую из библиотек, не относящихся к VBA, необходимо так резервировать с помощью команды Declare.

Фраза vbKeyShift в команде — это заменитель кода клавиши Shift (его значение — 16), а vbKeyControl, как нетрудно понять — заменитель кода клавиши Control. Структура инструкций "If…Then", думается, ясна,[9] а если нет — посмотрите в справке VBA. Команда Call перед именем макроса, как вы помните, означает его запуск.

В Интернете есть русские сайты, посвященные API.[10] Посетите их, чтобы узнать больше об этом наборе функций.


Настройка вызова программы. Последние штрихи

Когда программа написана и отлажена, необходимо придать ей "товарный вид", — убрать лишние команды и модули, сделать способ вызова программы — кнопку или пункт меню, может быть, создать панель инструментов для кнопок. Без этого даже с очень хорошо написанной программой сможет работать лишь ее создатель, да и то не всегда. К тому же красивая обложка всегда радует глаз.

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

Далее надо решить, в каком формате программу стоит оформить — как шаблон Word, как автозагружаемый шаблон Word или как простой документ? Если программа предназначена для одномоментных нечасто используемых расчетов и не работает с текстом документа, то ее проще всего поместить в документ Word. При необходимости его можно будет открыть и выполнить программу. Если программа как-то оформляет текст особого документа, который надо создавать отдельно от всех (к примеру, программа для красивого форматирования поздравительных открыток), то ее лучше оформить как шаблон и создавать на его основе документы, а потом уже эти документы заполнять содержанием с помощью программы. Ну, а если программа выполняет какие-нибудь серьезные операции с текстом, постоянно требуется или работает с многими документами сразу, то тогда ей прямая дорога в папку автозагружаемых файлов Word.

Потом необходимо создать документ с программой. Для этого создается пустой документ необходимого формата — шаблон или простой файл Word, а затем с помощью диалогового окна Word «Организатор» ("Сервис — Макрос — Макросы — Организатор" или "Сервис — Шаблоны и надстройки-Организатор") в него копируются все готовые компоненты программы из шаблона или документа, где велась разработка. Документ сохраняется под каким-нибудь красивым именем.

И, наконец, делается способ вызова программы. Можно с помощью диалогового окна "Сервис — Настройка — Команды — Макросы" назначить макросу пункт меню или кнопку на стандартной панели путем простого перетаскивания. Можно там же назначить ему комбинацию клавиш для вызова. А можно, что считается лучшим вариантом, создать новую панель инструментов и уже на ней поместить кнопки для вызова макросов. Надо только сохранить все изменения именно в документе с макросами, а не в своем Normal.dot или где-нибудь еще.

В окне "Сервис — Настройка — Команды — Макросы" название каждого макроса отображается так: сначала пишется имя проекта (его можно посмотреть и изменить в Окне свойств редактора VBA, выделив мышью название нужного проекта), затем — имя его модуля (тоже можно изменить в окне свойств, выделив мышью название модуля), а затем — собственно имя макроса (то, что стоит после команды начала программы Sub).

Назначить кнопку или сочетание клавиш для вызова формы невозможно. Необходимо вставить команду вызова формы ("ИмяФормы. Show") в текст программы в модуле, и уже затем назначить кнопку или сочетание клавиш для вызова именно этой программы.

Для вызова программы очень удобно использовать кнопки с иконками. Для этого нужно всего лишь перетащить название нужного макроса из окна «Настройка» на какую-нибудь (лучше специально созданную) панель инструментов, а затем выбрать значок для кнопки и задать стиль отображения — лучше всего без текста, "Основной стиль".

Можно также оставить на кнопке текст с названием макроса, однако тогда этот текст стоит соответственно отредактировать. Стоит помнить, что при подведении курсора мыши к кнопке, вызывающей макрос, отображается всплывающая подсказка с названием макроса (берется название макроса после команды начала программы Sub), поэтому макросам неплохо давать осмысленные имена. Однако если макрос назван по-русски, то в нелокализованных версиях Word он не будет вызываться кнопкой, созданной в русской версии.

Всплывающие подсказки кнопок можно задать самостоятельно с помощью команды "CommandBars("Имя панели"). Controls("Номер иконки на панели"). TooltipText = "Текст подсказки"". К сожалению, через диалоговое окно настройки панелей и кнопок сделать это не удастся, поэтому для ввода этой команды придется использовать отдельный модуль или Окно отладки.

Вам может не понравиться весьма ограниченный выбор значков для кнопок, предлагаемый Word'ом. Этот набор, вызываемый из меню "Выбрать значок для кнопки" в режиме настройки панелей, действительно, маловат. Но никто не мешает с помощью других команд того же меню скопировать значок с любой другой кнопки на любой другой панели или создать его самому во встроенном редакторе изображений на кнопках. Кроме того, красивые значки можно извлечь из «недр» Office, — а он содержит в себе около двух тысяч разнообразных значков! Для этого достаточно ввести в Окне отладки команду

CommandBars("имя существующей панели инструментов"). Controls.Add(Type:=msoControlButton, ID:=797). FaceId = x

где х — любое число от 1 до 3000. Тогда на указанной в команде панели будет создана кнопка со значком, который можно скопировать на свою кнопку. Не для всех кодов существуют значки, поэтому иногда созданная таким образом кнопка будет пустой, — попробуйте еще раз с другим х.[11]

Если в качестве способа вызова макроса выбрана панель инструментов с кнопками, то после окончания работы над ней стоит повторить создание нового документа и вновь скопировать все компоненты программы в новый документ вместе с панелью. Такое преобразование позволит существенно сократить размер файла с программой, так как вследствие ошибки в Office при редактировании макросов файл с программой сильно увеличивается в размерах — до полутора-двух раз. Впрочем, в OfficeXP данная рекомендация уже неактуальна.

Не стоит забывать и об информативном руководстве для пользователя, особенно если программа будет распространяться через Интернет. Лучше всего такое руководство оформить в отдельном текстовом файле или, если оно имеет большой объем, в виде набора связанных html-документов.


Полезные советы

· Настройки программы можно сохранять в системном реестре Windows. Для этого служит команда "SaveSetting", с помощью которой можно поместить в системный реестр строку или число. Она имеет формат "SaveSetting "Имя приложения","Имя раздела", «Ключ», "Значение"". Имя приложения, имя раздела и ключ — указатели места, в котором сохраняется Значение. Получить значения из реестра можно командой "GetSetting" с синтаксисом "GetSetting "Имя приложения","Имя раздела", «Ключ», "То значение, которое следует вернуть, если такого ключа, как указанный в предыдущем параметре, в реестре нет"", а удалить — командой "DeleteSetting "Имя приложения","Имя раздела", "Ключ"". Например:

SaveSetting «Макросы», «Макрос1», "Имя папки", "C: \MyPapka"

papka = GetSetting «Макросы», «Макрос1», "Имя папки", "C: \Docs"

· Записать список всех установленных в системе шрифтов в массив можно таким способом:

ReDim shrifti(FontNames.Count) As String

For r = 1 To FontNames.Count

shrifti(r) = FontNames(r)

Next r

WordBasic.SortArray shrifti()

(В массив "shrifti()" размером в количество шрифтов в системе помещается список имен всех установленных в системе шрифтов. Команда "WordBasic.SortArray" сортирует его по алфавиту.)

· Условие "If Selection.Type = wdSelectionIP Then …" выполнится, только если в документе не выделен фрагмент текста.

· Если вы решили хранить какую-нибудь информацию, нужную при работе программы, в отдельном файле, не стоит экспериментировать с командами чтения и открытия файла типа «open», «write» и др. Просто открывайте файл в Word как текстовый с помощью команды "Documents.Open …" и пишите в него обычными средствами записи текста: "Selection.Text = "Мой текст"".

· Посмотрите повнимательнее свойства, объекты и методы таких объектов, как «Application» и «System» (для этого достаточно набрать название объекта и поставить после него точку, — список возможных продолжений отобразится сам). Среди них можно найти немало весьма интересных и полезных, вроде средства задания и получения значений ширины и высоты окна Word, информации о языке данной версии Office, метод чтения данных из произвольного места реестра и многое другое.

· С помощью фрагмента кода

Set MyData = New DataObject

MyData.SetText "Мой текст"

MyData.PutInClipboard

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

· С помощью команды "Options.DefaultFilePath("константа названия папки")" можно получить пути и имена папок, перечисленных в диалоговом окне Word «Сервис» — «Параметры» — «Расположение». Все константы перечислены в справке VBA по слову «DefaultFilePath», а об их значении можно легко догадаться, переведя название константы с английского.

· Если у одного из элементов формы установить свойство Cancel в True, то нажатие кнопки Esc будет эквивалентно клику мыши на этом элементе.

· Если вы пишете инсталлятор для ваших программ, который помещает шаблоны с макросами в папку автозагружаемых файлов Word,[12] то совсем необязательно требовать перезагрузки редактора, чтобы макросы из помещенного в эту папку шаблона стали доступны. VBA позволяет активизировать такие шаблоны без перезагрузки Microsoft Word — для этого существует специальная команда

AddIns.Add("полное имя шаблона, включая путь к нему и расширение"). Installed = True

Эта команда эквивалентна ручному подключению шаблона с макросами через меню Word "Сервис — Шаблоны и надстройки". Однако если она будет выполнена сразу же после программного копирования шаблона в папку автозагружаемых файлов, то может возникнуть ошибка вследствие того, что при таком копировании Word должен зарегистрировать этот шаблон как доступный для подключения (после регистрации он появится в диалоговом окне "Сервис-Шаблоны и надстройки", но не будет отмечен как загруженный). На это уходит пара секунд, и если в этот момент вызвать команду подключения шаблона, то Word может ответить программе, что такого шаблона в папке автозагрузки нет, что вызовет ошибку.

Предотвратить подобную ситуацию можно, например, с помощью следующей конструкции, — разместите ее после команды копирования шаблона "FileCopy":

a="Имя шаблона в папке автозагрузки с полным указанием пути"

On Error Resume Next

Do

If AddIns(a). Installed Then Exit Do

AddIns(a). Installed = True

Loop[13]

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

· Для удаления шаблона без выгрузки Word можно использовать такой же код:

a="Имя шаблона в папке автозагрузки с указанием пути"

On Error Resume Next

Do

If Not AddIns(a). Installed Then Exit Do

AddIns(a). Installed = False

Loop

AddIns (a). Delete

Kill (a)

· Команда "Kill" выполняет удаление файла.

Команда "On Error Resume Next", встречающаяся в обоих вышеприведенных фрагментах кода — это обработчик ошибок. В случае возникновения ошибки в коде после него (скажем, связанной с обращением к несуществующему объекту) он продолжит выполнение программы с команды, следующей за вызвавшей ошибку. Обработчик ошибок может также иметь вид "On Error GoTo метка", и тогда при ошибке в коде после него произойдет переход к указанной в обработчике метке и выполнение программы продолжится именно с нее.

· Если вы, работая в Word 97, часто сохраняете документы в формате HTML, и вам мешает постоянно появляющийся диалог о выборе кодировки файла (рис. 5.2), то отключите его, установив в системном реестре строковый параметр "HKEY_LOCAL_ MACHINE\Software\Microsoft\Shared Tools\ Text Converters\Export\HTML\Options\Show EncodingDialog" как «No». Установить этот параметр реестра можно и программно с помощью команды "System.PrivateProfileString("", "HKEY_LOCAL_MACHINE\Software\Microsoft\Shared Tools\Text Converters\ Export\HTML\Options", "ShowEncodingDialog") = "No""



Рис. 5.2. Как убрать этот диалог? Читайте справа.


· Если Вы закрыли исходный код Вашей программы на VBA от просмотра паролем, а потом благополучно его забыли — не огорчайтесь: в Интернете, по адресу www.passwords.ru есть программа AVPR, позволяющая восстановить забытый Вами пароль. Ее английская версия требует оплаты и регистрации, а русская — бесплатная. К сожалению, бесплатная версия работает только с файлами, созданными в Word и Excel из Microsoft Office 97.

Чтобы ускорить работу программы, работающей с текстом, поставьте в ее начале команду "Application.ScreenUpdating = False", а в ее конец — команду "Application.ScreenUpdating = True", если

· только в процессе работы программы не требуется визуальный контроль происходящих изменений. Эта команда позволяет системе не тратить время и силы на постоянное обновление экрана и отображение изменений. Для того, чтобы все же обновить экран после отключения обновления экрана, используйте команду "Application.ScreenRefresh".

· Для получения от пользователя определенных данных, кроме создания форм, можно использовать встроенные диалоги VBA — диалоговое окно "Открытие файла", "Свойства документа" и др. Они вызываются командой Dialogs("Название диалога"). Show (показывает диалог и выполняет соответствующие ему действия), Dialogs("Название диалога"). Display (только показывает диалог и позволяет записать в переменные введенные изменения, но не выполняет никаких действий и ничего не изменяет: очень полезно для использования встроенных диалоговых окон в своих целях), Dialogs("Название диалога"). Execute (ничего не отображает на экране, но применяет все те изменения, которые были сделаны ранее с помощью команды With Dialogs("Название диалога") … End With). Для вывода списка возможных диалогов наберите "Dialogs(", и Вам будет выдан их список. К сожалению, описания конкретных диалогов нет в справке — придется просто попробовать отобразить каждый, хотя список возможных параметров каждого диалога в справке есть.

В Microsoft Excel набора встроенных диалогов нет, однако отобразить на экране окна открытия и сохранения файлов все же можно. Для этого служат команды "Application.GetOpenFilename" и "Application.GetSaveAsFilename". В результате выполнения команды "file = Application.GetOpenFilename" будет отображено окно открытия файла, а после выбора имя файла поместится в переменную (здесь — "file"). Команда же "rez = Application.GetSaveAsFilename" отобразит окно сохранения файла, в переменную же (здесь — rez) будет помещено True — если сохранение успешно, и False — если нет. Обе команды докускают указание параметров (например, меняющих заголовки окна и других).

Иногда возникает необходимость вызвать из макроса какое-либо диалоговое окно, но так, чтобы такой вызов ничем не отличался от «ручного», производимого через пункты меню Word. А возможно это не всегда: так, команда "Dialogs(wdDialogEditFind). Show" действительно вызывает окно поиска, но при этом в случае ввода в него фрагмента, которого в тексте нет, не отображается сообщение о безрезультатности поиска.

Тем не менее вызвать из макроса данное окно так, чтобы оно работало точь-в-точь так же, как и «обычное», можно — для этого следует использовать имеющуюся в VBA функцию SendKeys, которая передает активному окну нажатия клавиш — как если бы они были нажаты на клавиатуре. Подробнее об этой функции вы можете прочитать в Справке по VBA, а использовать ее для вызова диалогового окна можно, к примеру, так:

Sub prog()

SendKeys "^f"

End Sub

предполагая, что комбинация клавиш Ctrl+f вызывает окно «Найти», как, впрочем, устанавливается по умолчанию. Список кодов функциональных клавиш — в Справке.

Если Вы используете функцию "SendKeys", то вызванное ею окно будет вести себя абсолютно так же, как при ручном вызове. Однако помните, что если пользователь переопределит заложенную Вами в макрос комбинацию клавиш, то Ваша программа начнет работать некорректно.

· Помимо привычных кнопок и выпадающих меню в Word существует еще несколько типов элементов вызова команд и программ — поля ввода и выпадающие меню выбора. К примеру, элемент "Выпадающее меню с полем ввода" используется для указания масштаба просмотра документа на панели «Стандартная» или для ввода вопроса к справочной системе в OfficeXP.

Создать такое поле можно только программно — через окно настройки это сделать нельзя (как, впрочем, и удалить их впоследствии). Для этого следует в окне отладки или в отдельном модуле выполнить команду

CommandBars(x). Controls.Add Type:=y

где «х» — номер панели (можно узнать, просто перебрав их все с помощью команды "MsgBox CommandBars(номер). Name" и выяснив, какой номер имеет панель инструментов с нужным названием), а «y» — одна из констант: "msoControlEdit", "msoControlDropdown", "msoControlComboBox", создающие соответственно поле ввода текста, выпадающее меню и выпадающее меню с возможностью ввода текста.

Управлять созданными полями, добавляя, к примеру, в них текст, можно стандартными командами работы с панелями инструментов. Так, чтобы поместить какой-либо текст в поле ввода, следует использовать команду

CommandBars(x). Controls(y). Text = "текст в поле ввода"

где «х» — номер панели, «y» — номер по счету слева направо данного поля среди кнопок этой панели. Таким образом можно использовать эти элементы для отображения нужной пользователю информации. Точно так же — командой "a=CommandBars(x). Controls(y). Text" можно считать информацию из данного поля и использовать ее в работе программы. Следует лишь внимательно следить за соответствием номеров кнопок их реальному расположению, — при изменении порядка кнопок программа может работать неверно. Назначить макрос кнопке, меню или полю ввода можно командой "CommandBars(x). Controls(y). OnAction = "Имя модуля. Имя программы"".

· Для работы из одного приложения Office с другим можно использовать технологию ActiveX. Она основана на имеющейся в Office возможности представлять одну программу в другой как некий объект, с которым можно работать теми же командами, что используются при непосредственной работе с этой программой. Так, чтобы можно было из Word'овского макроса работать с Excel'ем, следует создать объект "Excel.Sheet":

·

Dim es As Object

Set es = CreateObject("Excel.Sheet")

Здесь «es» — простое наименование переменной, может быть любым.

(Если надо сразу открыть какой-либо файл Excel'а, то можно использовать команду "GetObject":

Set es= GetObject("Путь к файлу Excel'а"))

При желании можно сделать созданный объект Excel видимым:

es.Application.Visible = True

Теперь можно этому объекту es (т. е. просто запущенному Excel'у) посылать команды такие же, как и в макросах Excel'а (предваряя текстом "es.Application." те из команд, которые не требуют прямого указания объекта, — так как надо дать понять программе, что работа идет именно с Excel'ем). Так, чтобы открыть файл Excel'а, можно также дать команду

es.Application.Workbooks.Open FileName:="Путь к документу Excel'а"

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

es.Cells(1, 1). Value = "Это столбец A, строка 1"

Закрыть Excel можно командой

es.Application.Quit

Set es = Nothing

Можно даже вызвать на исполнение макрос, содержащийся в книге Excel. Для этого следует использовать команду

es.Application.Run "имя макроса"

Так что есть простор для творчества.


ProgressBar в ваших программах

Во многих программах для Windows используется такой элемент, как ProgressBar — индикатор, показывающий, на сколько продвинулся тот или иной процесс. В частности, он есть практически во всех программах-инсталляторах. К сожалению, в VBA этот элемент отсутствует, но его можно сделать самостоятельно!

Выглядеть он будет, например, так, как на рис. 5.3.

А делается он следующим образом (предполагается, что у нас есть часть программы, в которой выполняется длинный и долгий цикл: то есть известное нам количество множество однотипных операций, и которую надо снабдить ProgressBar'ом):

1. Создаем небольшую форму и помещаем на нее: надпись с пояснительным текстом (например, "Label1") и две другие надписи, (скажем, «Label2» и "Label3"), низкие и широкие, которые расположим одну над другой (рис. 5.4).

К примеру, их координаты и размеры:

Label2: Top — 45, Left — 15, Height — 15, Width — 250

Label3: Top — 45, Left — 15, Height — 15, Width — 0

Зададим в качестве фонового цвета для «Label2» — серый, а для «Label3» — зеленый (свойство «BackColor», вкладка "Палитра").



Рис. 5.3. ProgressBar в программе на VBA



Рис. 5.4. А вот как он сделан


2. Для того, чтобы форма появилась на экране, но могла быть модифицируема программно все время своего отображения, в ее код нужно поместить следующий текст:

Private Sub UserForm_Activate()

… остальной текст программы, которая должна выполняться во время отображения ProgressBar'а …

Unload Me

End Sub

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

3. Идея такова. Ширину третьей надписи «Label3» можно изменять программно. Поэтому для отображения ProgressBar'а надо вставить в код строки, изменяющие ширину этой надписи. К примеру, цикл в программе выполняется n раз. Тогда ширина надписи «Label3» будет определяться командой в теле цикла по формуле "Label3.Width = (scet / n) * 250", где "scet" — это счетчик цикла, а 250 — ширина надписи Label2.

После каждой такой команды надо вставлять инструкцию "Me.Repaint", чтобы перерисовать форму с учетом новых параметров третьей надписи, — автоматической перерисовки до полного отображения формы (которое произойдет, когда кончится обработка события "UserForm_Activate()"и форма не будет выгружена) не происходит. Если форма с ProgressBar'ом должна долго находится на экране без изменений, то рекомендуется почаще использовать команду "Me.Repaint", так как без перерисовки внешний вид формы может быть легко испорчен окнами других приложений, когда пользователь решит воспользоваться ими во время работы макроса.

Итак, код для формы с ProgressBar'ом должен иметь такой вид ("n" — количество необходимых выполнений цикла):

Private Sub UserForm_Activate()

Me.Repaint

For t=1 to n

… … … … необходимые команды программы в цикле … … … …

Label3.Width = ((t / n) * 250)

Me.Repaint

Next t

Unload Me

End Sub

Разумеется, в нем возможны изменения и улучшения. Можно несколько раз использовать ProgressBar в одной форме, каждый раз обнуляя ширину третьей надписи. Можно поместить на одну форму несколько ProgressBar'ов, где один, например, показывает выполнение всего задания, а другой — его текущей части.


Хранение скрытой информации в документе

Иногда автору программы необходимо записать в документ информацию "для внутреннего пользования": например, чтобы при следующей обработке документа программой использовать определенные предыдущие данные.

Можно, конечно, использовать Свойства документа (объект "Dialogs(wdDialogFileSummaryInfo). Comments"), но лучше сделать такую запись с помощью добавления специальной переменной прямо в документ Word:

ActiveDocument.Variables.Add Name:="x1", Value:="Текст"

ActiveDocument.Variables.Add Name:="x2", Value:=12

Прочитать эти переменные можно будет с помощью похожей функции:

y1 = ActiveDocument.Variables("x1"). Value

y2 = ActiveDocument.Variables("x2"). Value

Кроме как с помощью этой функции, значения заданных в документе переменных узнать нельзя никак! Таким способом можно помещать в документ служебную информацию для макросов: сохраненные параметры, скрытые комментарии и и.д. Но не думайте, что для надежного сокрытия секретной информации достаточно поместить ее в переменные документа — с помощью функции

For Each per In ActiveDocument.Variables

Debug.Print per.Name + " " + per.Value

Next per

абсолютно все переменные будут благополучно помещены в окно отладки, где их легко и просто можно просмотреть.


Немного о панелях, шаблонах и макросах

Панель инструментов Microsoft Word 97/2000/XP — то есть ее название, набор кнопок, расположенных на ней, связь этих кнопок с командами и макросами — может храниться либо в шаблоне Microsoft Word 97/2000/XP (*.dot), либо в документе Word (*.doc). При этом имеет место быть следующее:

1. Если панель инструментов сохранена в Normal.dot, то она доступна всегда, когда открыт Word.

2. Если панель инструментов сохранена в шаблоне, который загружен как глобальный — то есть помещен в папку автозагружаемых файлов Word, то она также доступна всегда, когда открыт Word, но ее можно убрать, выгрузив шаблон с помощью диалогового окна "Сервис-Шаблоны и надстройки".

3. Если панель инструментов сохранена в шаблоне, на котором основаны документы, например, в одном из шаблонов, находящихся в папке шаблонов пользователя Word[14] и ее подпапках, то она доступна тогда, когда этот шаблон присутствует на компьютере и активен документ, созданный на его основе.

4. Если панель инструментов сохранена в каком-либо документе, то она доступна тогда, когда активен этот документ.

Панели инструментов можно копировать из одного шаблона или документа в другой с помощью диалогового окна «Организатор» (Сервис — Шаблоны и надстройки — Организатор).

Информация о том, какие панели при предыдущем выходе из Word'а были видимы, а какие нет, как они располагались и где находились на экране (чтобы восстановить эти их параметры при новой загрузке Word), сохраняется в системном реестре. Информация же о том, как должны располагаться панели при самой первой загрузке шаблона, находится в самом шаблоне и используется при отсутствии нужной информации в реестре.

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

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

Несмотря на то, что в параметрах кнопки при назначении ей макроса указывается, где этот макрос находится — в Normal.dot, в каком-либо шаблоне или документе, этот параметр Word'ом не учитывается. Поэтому если в глобально загруженном шаблоне (то есть помещенном в папку автозагружаемых файлов Word) есть макрос с таким же названием и именем, что и в Normal.dot, то при нажатии кнопки, вызывающей этот макрос (расположенной на любой панели), выполняется макрос из Normal.dot, а не из глобального шаблона.

Если при запуске Word в папке Шаблоны не оказывается шаблона Normal.dot, то он создается Word'ом на основании стандартов по умолчанию. В него помещается изначальный набор панелей инструментов.

Поиск модуля и имени макроса при нажатии кнопки (при этом не имеет значения, где панель сохранена) идет в следующем порядке: "Активный документ" — "Шаблон, на котором основан документ" — "Normal.dot" — "Шаблон, загруженный глобально через папку автозагружаемых файлов Word или окно "Шаблоны и надстройки".

Кнопки с панелей можно свободно перемещать с панели на панель, при этом их связь с макросами сохраняется вне зависимости от того, где макрос находится. Если макрос недоступен (скажем, удален глобальный шаблон с ним), то кнопка просто не работает.


Немного о паролировании и шифровании

Защита доступа с помощью пароля — самый распространенный способ хранения всяческих секретов на компьютере. Однако о принципах такой защиты большинству пользователей известно плохо. В чем же ее основы? И как можно преодолеть такую защиту? Ниже рассказывается об этом.

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

Среди математических логических функций, таких, как И, Или и других, есть весьма примечательная функция Xor. Команда, выполняющая эту функцию, есть практически во всех языках программирования. Ее действие отражено в следующей таблице:



Иными словами, это некое подобие функции Или,[15] которая в отличие от настоящей Или возвращает 0, если на входы было подано сразу две единицы.

А теперь — приглядитесь повнимательнее и обратите внимание на интереснейшую вещь: если на вход функции Xor подать значение 1 входа и результат, то получится значение 2-го входа! И то же самое — со значением 2 входа и результатом: получается значение 1-го входа. Следовательно, зная итог функции Xor и значение на любом из входов, можно получить значение на другом входе, то есть функция Xor обратима.

А отсюда вытекает и принцип парольного шифрования. Берем некий текст, который должен быть зашифрован и некое слово, служащее паролем. Любой текст — это последовательность букв-байтов, а любой байт равен восьми битам, что позволяет представить текст как последовательность битов — нулей и единиц:

11010101010110101001101010111110101010111110101010001…

Представляем так же пароль:

10010101010011

и сопоставляем последовательности битов шифруемого текста и пароля, повторив пароль несколько раз так, чтобы у каждого бита шифруемого текста был соответствующий ему бит пароля:

11010101010110101001101010111110101010111110101010001…

10010101010011100101010100111001010101001110010101010…

И теперь — шифруем: применяем к этим двум последовательностям функцию Xor:

01000000000101001100111110000111111111110000111111011…

Все — шифрование закончено! Полученную последовательность можно хранить в качестве зашифрованного паролем файла. Ну, а когда потребуется расшифровка, то будет необходимо просто применить ту же самую функцию Xor к этой последовательности вместе с паролем, и тогда в результате получится исходный текст. Преобразовать же последовательность нулей и единиц обратно в текст труда не составит.

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

Функция Xor, разумеется, присутствует и в VBA. Вот пример кода, реализующего возможности шифрования с ее помощью.

Sub encrypt()

Dim a, b, c, d As String

Исходный текст для шифрования — запрашивается от пользователя, к примеру:

a = "secret text from kgb agent from newyork rezidentura…"

Пароль: может запрашиваться от пользователя:

b = «password»

Итог шифрования:

c = ""

Узнаем длины каждой из строк — пароля и исходного текста:

lentext = Len(a)

lenpass = Len(b)

Собственно шифрование:

For cn = 1 To lentext

В этой строке попробуйте разобраться самостоятельно. Здесь выполняется функция Xor с каждым символом исходной строки и соответствующим символом пароля, как бы «повторенным» на всю длину исходного текста. Mid берет из середины строки символ, Asc — превращает его в ASCII-код, Str — превращает число в строку, Trim — удаляет пробелы:

d = Trim(Str(Asc(Mid(a, cn, 1)) Xor Asc(Mid(b, ((cn — 1) Mod lenpass) + 1, 1))))

А теперь сделаем так, чтобы каждый символ занимал ровно три позиции, вне зависимости от величины его ASCII-кода. А иначе как потом при расшифровке разбивать строку на символы?

Select Case Val(d)

Case 0 To 9

d = «00» + d

Case 10 To 99

d = «0» + d

End Select

c = c + d

Ну вот и все, и так — с каждым символом из исходной строки:

Next cn

Теперь в переменной с — шифрованная строка, каждой исходной букве соответствует 3 символа. Ее можно записать, например, в документ:

Selection.TypeText Text:=c

End Sub

А теперь — программа расшифровки данных. Точно так же разберем ее по строкам.

Sub decrypt()

Dim a, b, c, d As String

Строка для расшифровки:

c = "003004016001018027082016021025007083017029029009"

Пароль:

b = "password"

Итог расшифровывания:

a = ""

Узнаем длины каждой из строк:

lentext = Len(c)

lenpass = Len(b)

Собственно расшифровывание (попробуйте разобраться самостоятельно в структуре команды — это не так сложно):

For cn = 1 To lentext Step 3

a = a + Chr(Val(Mid(c, cn, 3)) Xor Asc(Mid(b, (Int(cn / 3) Mod lenpass) + 1, 1)))

Next cn

В итоге в переменной a — расшифрованная строка, ее можно записать в любое место — в документ, к примеру:

Selection.TypeText Text:=a

End Sub

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


Открытый и закрытый коды

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

При шифровании с закрытым ключом для кодирования и расшифровки используется одна и та же последовательность символов в качестве пароля — ключа. Пример — тот, что описан выше. При шифровании же с открытым ключом используются две последовательности символов, причем зашифрованное с помощью первой последовательности можно расшифровать только с помощью второй, и наоборот. Обе последовательности связаны между собой по определенному закону, при этом из второй последовательности можно получить первую, но из первой вторую не узнаешь, — обратное преобразование невозможно.

Сгенерировав специальной программой пару таких последовательностей (называемых ключами), можно первую из них сообщить тому, от кого ждешь секретных посланий ("сообщить ему публичный ключ"), а вторую оставить себе и хранить как зеницу ока ("оставить себе секретный ключ"). То, что будет зашифровано отправителем этим публичным ключом, даже сам отправитель расшифровать не сможет. Это сможет сделать только обладатель секретного ключа.

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

Именно на таком принципе работает механизм шифрования PGP.


Отличия новых версий Office

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

В Office2000 изменилась система защиты от вирусов в макросах. Так, в Word2000 для того, чтобы иметь возможность запускать макросы, необходимо, чтобы в диалоговом окне "Сервис — Макросы — Безопасность" был установлен «Средний» или «Низкий» уровень защиты от макросов (лучше «Средний» — тогда при открытии документов с макросами пользователю будет выдан запрос о необходимости разрешения исполнения макросов). Также в Word2000 для того, чтобы пользователь имел возможность запускать макросы из шаблонов, установленных в папку автозагружаемых файлов Word, необходимо на вкладке "Надежные источники" диалогового окна "Сервис — Макросы — Безопасность" установить отметку в пункте "Доверять всем установленным надстройкам и шаблонам". Обо всем этом следует упомянуть в документации к разрабатываемой вами программе.

То же самое верно и для Office XP, однако отличия есть и здесь. Во-первых, по умолчанию компоненты Office XP, отвечающие за запуск макросов, на жесткий диск не ставятся — таким образом, похоже, Microsoft пытается защитить наиболее неразумных пользователей от макровирусов. По большому счету, подобные ее действия обычно приносят больше вреда, чем пользы, для авторов же программ на VBA из этого следует, что в справочных файлах к своим программам им следует упоминать о необходимости доустановки компонентов Office перед началом использования макросов. Во-вторых, для того, чтобы иметь возможность программно копировать модули и формы макросы между документами и шаблонами, необходимо, чтобы в диалоговом окне "Сервис — Макросы — Безопасность", на вкладке "Надежные источники" имелась отметка в пункте “Доверять доступ к Visual Basic Project”. Об этом тоже следует упомянуть в справке к программе.

В OfficeXP скопировать файл из одной папки в другую или удалить его посредством программного кода можно только при отключенной Службе индексирования (cсылка “Параметры поиска” на панели “Обычный поиск", рис. 5.5). К сожалению, по умолчанию эта Служба включена, а программно ее отключить невозможно. Поэтому, несмотря на декларируемую полную "совместимость сверху вниз" версий Office, автору программ на VBA настоятельно рекомендуется тестировать свои программы во всех версиях Office и отлаживать их при необходимости.



Рис. 5.5. Если в OfficeXP вы хотите копировать и удалять файлы с помощью VBA — выключите здесь “Службу индексирования”.

Глава 6. Волшебный мир макросов

О том, как создавать программы на встроенном в Microsoft Office языке программирования Visual Basic for Applications (VBA), было подробно рассказано в предыдущих главах. Но теория будет еще полезнее, если подкрепить ее практикой — примерами реально работающих программ, написанных на этом языке. А таких — немало. К сожалению, многие из них не такие уж и известные, но весьма интересные и полезные для очень многих пользователей.

В этой главе вы найдете небольшой обзор существующих на настоящее время программ на языке VBA, работающих в среде Microsoft Office. Обратите внимание на них — если вы часто и много используете текстовый редактор Microsoft Word или другие компоненты Office, то они могут серьезно помочь вам в работе. Отличительная особенность большинства программ, описанных здесь — то, что они распространяются с открытым кодом. То есть — вы можете свободно просматривать текст программ, исследовать его, учиться на опыте ваших коллег, изучая код их программ и стремясь понять предназначение каждой строчки и каждой команды.

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

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


«Untaco» — расшифровка чисел и их обновление

Довольно часто в бухгалтерской и финансовой документации вместе с цифровой записью числа требуется указывать и его текстовую расшифровку — например, писать «сто» после числа 100. Довольно ясно, что делать это вручную утомительно, да и небезопасно — можно легко ошибиться. И не случайно данный процесс весьма большое количество пользователей решило поручить макросам — программам на VBA. Дополнений для Word, помещающие в документ текстовые расшифровки чисел, создано немало.

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



Рис. 6.1. Untaco — многофункциональный конвертор «число-текст» с возможностью автоматического обновления расшифровок чисел.


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

В Untaco реализованы интересные технические решения, связанные с работой с переменными в документе, закладками, интеллектуальной обработкой текстовых строк, а также с операциями над самими макросами (их копирование и удаление). Также в Untaco показано, как осуществить подмену стандартных команд Word (например, «Сохранить», "Печать") макрокомандами. Простой и удобный инсталлятор демонстрирует возможность помещения компонентов программ в шаблон Normal.dot.

Программа Untaco доступна с адресов: http://antorlov.chat.ru или http://www.newtech.ru/~orlov.


TreeView — кнопка «Пуск» для Microsoft Word

Данная разработка способна серьезно облегчить труд тех, чей рабочий инструмент — Microsoft Office. Коротко можно сказать, что она — окно "Открыть файл", сделанное по образцу папки Internet Explorer'a «Избранное» (или меню Windows "Пуск"), — в виде выпадающего меню отображаются все документы в текущей папке и в любых других, указанных пользователем, что позволяет искать и открывать документы, не выходя из Word и не роясь в изрядно поднадоевшем окне Word «Открыть» (рис. 6.2).



Рис. 6.2. TreeView. Чтобы открыть нужный файл, просто пробегитесь мышкой по этим ниспадающим меню и найдите его.


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

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

Автор «TreeView» — Антонюк Дмитрий Александрович из города Комсомольск-на Амуре. Программу можно загрузить с сайта разработчика http://treeview.chat.ru.


SuperTypist — набиратель текстов

Небольшая программа SuperTypist, созданная Константином Ушаковым, предназначена для быстрого и удобного набора текстов. Для работы с программой сначала нужно создать небольшой словарь с теми словами, которые, по Вашему желанию, должны набираться автоматически (о том, как создавать этот словарь и куда его потом помещать, написано в инструкции к программе). Когда же вы начнете набирать какое-нибудь слово из словаря, макрос автоматически подставит его окончание, как только это слово будет однозначно определено. Если вы желаете набрать другое слово, начинающееся с тех же букв, что и записанное в словаре, то просто продолжайте набор, и подставленное слово исчезнет. А если вы согласны с макросом, то нажмите стрелку влево, и курсор автоматически перейдет к концу вставленного слова.

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

Загрузить SuperTypist можно из Библиотеки Microsoft Office Extensions, расположенной по адресу http://www.microsoft.ru/offext.


ВерсткаТекстаКнижкой — книгоиздательство в Word

Иногда при подготовке документов в Microsoft Word возникает необходимость распечатать их в виде книжки размером в половину листа, так, чтобы после печати ее можно было бы сшить посередине. Такую книжку удобно взять с собой, да и просто читать, а для учебных материалов подобный вид был бы самым удобным. Зачастую методические пособия в высших учебных заведениях выпускаются именно в таком формате.

До недавнего времени стандартными средствами Word сделать такую книжку было невозможно. Многие пользователи прибегали к различным ухищрениям (к примеру, устанавливая «зеркальные» поля в полстраницы и пропуская каждый лист через принтер четыре раза) или пытались освоить специализированные программы верстки вроде PageMaker'а. В любом случае создание брошюры было весьма непростой задачей. В OfficeXP возможность делать брошюры появилась, однако просмотреть макет перед печатью и вывести на принтер его отдельные листы невозможно, так что при сбое принтера приходится перепечатывать весь макет заново. Кроме того, системные требования данного пакета программ весьма немалые.

Но книжку можно спокойно сделать в Word любой версии, начиная с 97-го, с помощью программы, написанной специально для этого и называющейся просто — «ВерсткаТекстаКнижкой». Она использует довольно оригинальный способ создания макета книжки, в качестве основы для него взяв надписи — обьекты Microsoft Word, способные содержать в себе текст. Надписи могут быть между собою связаны, и текст, вводимый в одну из них, при исчерпании свободного места в ней перетечет в другую, следующую по порядку связывания надпись. Эта возможность и используется в программе, которая заполняет макет книжки связанными надписями, соответствующими ее отдельным страничкам, а затем копирует в них текст из исходного документа. В результате получается макет книжки, готовый к печати (рис. 6.3), который в случае необходимости можно спокойно редактировать, а при сбое в процессе печати нетрудно перепечатать любой лист макета. Макет составлен так, что каждый второй лист в нем является обратной стороной первого, поэтому на принтере с двусторонней печатью получить готовую книжку можно, просто послав на печать документ со сверстанным макетом. На обычных принтерах необходимо посылать на печать вначале нечетные, а затем четные страницы макета (для автоматизации данного процесса служит специальный макрос, входящий в комплект поставки программы). При необходимости макет книжки можно перенести для печати на другой компьютер, где данная программа не установлена.



Рис. 6.3. Сделать книгу в Word теперь не проблема. Вот написать бы еще ее сначала


Каждый второй лист в макете книжки — обратная сторона первого, так что на принтере с двусторонней печатью достаточно будет одного «прохода», чтобы получить готовую книжку, а на остальных принтерах придется сначала посылать на печать нечетные, а затем четные страницы макета, соответственным образом переложив листы после первой печати. Для автоматизации такой печати служит специальный макрос, входящий в комплект поставки программы.

Исходный документ при работе макроса не изменяется. В тексте могут содержаться графические обьекты, сноски, диаграммы, которые автоматически переносятся в макет книжки.

У программы имеется множество настроек и дополнительных возможностей. Так, можно создать пустой макет документа из определенного числа страничек, а потом вставить туда текст. Можно создать книжку не из последовательно располагающихся листов, а разбитую на отдельные тетрадки, которые затем можно будет сшить между собой. Можно задать параметры верстки так, что на каждой страничке полученной книжки будут располагаться две колонки текста. Программой производится нумерация страничек книжки, причем шрифт и расположение номеров пользователь может задать. Имеется подробное руководство пользователя, которое рекомендуется прочитать перед началом использования программы. Программа имеет как русский, так и английский интерфейс.

Также в комплект поставки входит программа «Файлообьединялка», которая поможет вам обьединить содержимое множества однотипных файлов в один.

Разумеется, у программы есть и недостатки, в основном обусловленные ограничениями Word в плане работы с надписями. Так, при наличии в исходном документе таблиц процесс верстки брошюры серьезно затрудняется, так как ширину таблиц приходится подгонять под ширину полученных страничек. Иногда при попадании таблицы на границу страничек пара ее строчек, примыкающих к этой границе, перестают отображаться (следствие ошибки в самом Word'е) — приходится принудительно разбивать таблицу. В случае наличия в исходном документе рисунков зачастую необходимо неоднократно переверстывать макет заново (впрочем, это нетрудно благодаря входящей в комплект дополнительной утилите), подбирая нужный размер рисунка, — программа их не масштабирует. Впрочем, данные проблемы возникают лишь при работе со сложными документами, содержащими большое количество таблиц и графики.

Ознакомиться с кодом компонентов пакета программ «ВерсткаТекстаКнижкой» рекомендуется всем, кто интересуется возможностями VBA по работе с содержимым документа, пользовательскими формами. Также весьма примечателен инсталлятор программы, который нетрудно приспособить для установки собственных разработок.

"ВерсткуТекстаКнижкой" можно загрузить с адресов:

http://antorlov.chat.ru или http://www.newtech.ru/~orlov.


Красоты из глубин Word

Когда обычный пользователь достигает определенных высот во владении компьютерными технологиями, то у него практически всегда возникает желание как-нибудь переделать привычные программы, настроить их под свои требования. Гибкая система настройки панелей и меню в Microsoft Word дает возможность это сделать весьма неплохо. Однако при добавлении новых команд на панели инструментов часто хочется присвоить командам красочные значки, отличающиеся от однообразных стандартных. Но набор значков, предоставляемый Word'ом по умолчанию в выпадающем списке выбора иконки для кнопки, не больно-то и велик…

Эту проблему успешно решает программа "Генератор иконок". Впрочем, вернее ее бы можно было бы назвать "Вытаскиватель иконок". Дело в том, что Microsoft Office содержит в себе, в своих исполняемых файлах и библиотеках около 3000 значков. Эти значки по умолчанию назначены разным командам, большую часть которых обычный пользователь никогда не вызывает по причине ненадобности или отсутствия информации о них. Но это не значит, что значки для этих команд нельзя использовать для своих целей! Icon Generator извлечет из «недр» Word'а эти значки, разместив их на специально созданных панелях инструментов (рис. 6.4), так что вам останется лишь скопировать их на свои панели с помощью стандартной функции "Копировать значок" режима настройки панелей. Пусть ваш Word расцветится красивыми иконками!



Рис. 6.4. И все это хранит в себе Word


Если Вы разрабатываете макросы для Word, то эта программа облегчит Вам жизнь — Вы сможете назначить своим макросам оригинальные иконки, не тратя время на их рисование. В шаблоне с макросом также имеется готовая подборка специально отобранных красивых значков.

Программу "Генератор иконок" можно загрузить с адресов

http://antorlov.chat.ru/develop.htm или http://www.newtech.ru/~orlov/develop.htm.


Для студентов и программистов

Пакет макросов, который называется очень просто — "Дополнения для Word", создан Петром Каньковски и доступен с адреса http://kankowski.narod.ru. Основное его предназначение — расширение возможностей пользователя Word, в особенности в плане составления документов, удовлетворяющих требованиям современных научных издательств и ВУЗов. Так, в комплекте пакета есть шаблоны «Реферат», «Заявление», позволяющие быстро оформить соответствующий документ, а параметры основного шаблона программы во многом соответствуют российским требованиям к оформлению научных публикаций. При установке программы большому расширению подвергается список автозамены — после установки пакета в него добавляются многие сокращения, позволяющие серьезно сэкономить время при наборе текста (например, «док-т» заменяется на «документ», «эл-т» — на "элемент").

"Дополнения для Word", а также другие разработки Петра Каньковски особенно заинтересуют тех, кто создает программы на VBA, так как все они поставляются с открытым исходным кодом и подробными комментариями в нем. Особенно примечательны специальные компоненты для разработчиков, доступные так же с сайта Петра — "Пакет для разработчиков" и "Ice In Eyes" (доступный со страницы http://kankowski.narod.ru/dev.htm). Помимо действительно полезных макросов, например, набора математических функций, и коллекции красивых значков, программисты на VBA найдут в этих разработках и коды функций работы из VBA с API — программным интерфейсом Windows, позволяющие отображать диалоговые окна Windows, вызывать команды операционной системы. Одна из разработок представляет собой HTML-конвертор, позволяющий эффективно и качественно преобразовать файл Excel в web-страницу. Этот конвертор в отличие от встроенных в Office средств сохранения данных в формате HTML генерирует компактный и корректный код.

Весьма примечательным является «Справка» к пакету, содержащая, помимо его описания, еще и обширную подборку советов по работе с Word. С "Дополнениями…" поставляется методичка "Как написать реферат", которая может помочь студентам в учебной работе с излишне строгими преподавателями. К сожалению, у пакета есть и мелкие дефекты (например, отключение без запроса отображения горизонтальной линии прокрутки вместе с кнопками выбора вида документа, развертывание по умолчанию окна Справки на весь экран), однако они не умаляют его достоинств и не мешают с ним работать.

На сайте Петра есть подборка ссылок на Интернет-ресурсы, посвященные VBA, а также сборник полезных советов по работе с Word и использованию API.


WOPR — Woody's Office Portal

WORP, или Woody's Office Portal — это большой и мощный пакет макросов, выполняющих самые разнообразные задачи, — от предоставления пользователю усовершенствованных диалоговых окон сохранения и открытия файлов до создания и печати конвертов или буклетов. С помощью компонентов WORP можно вставить в документ зеркальное отображение любого его фрагмента, свободно изменять даты создания и изменения файлов, удобно настраивать параметры вставляемых рисунков. WORP поможет пользователю в восстановлении поврежденных документов Word или в управлении стилями.

Сайт программы расположен по адресу http://www.wopr.com. Основная версия программы работает под Word 97, однако на сайте есть модули, использующие возможности новых версий Word. К сожалению, по умолчанию код WORP закрыт от просмотра, однако вам может помочь решить эту проблему упоминаемая в прошлой главе бесплатная версия программы AVPR с сайта www.passwords.ru. Программа распространяется по принципу Shareware, а объем установочного файла превышает три мегабайта.


Библиотека макросов

В Интернете есть целый сайт, посвященный программам на VBA. Это — неоднократно уже упомянутая Библиотека Microsoft Office Extensions — http://www.microsoft.ru/offext. Там представлены макросы на любой вкус: и для набора текстов, и для бухгалтерской работы, и даже игры. На сайте программы Microsoft Office Extensions есть также специальный раздел «VBA-форум», в котором публикуются статьи специалистов по VBA как для начинающих, так и для опытных разработчиков.



Рис. 6.5. Знак качества PC Magazine


Всем программам, помещаемым в Библиотеку Microsoft Office Extensions, выдается специальный Знак Качества "Yes, Its Works" (рис. 6.5). Его можно размещать на сайте программы, на коробках с дистрибутивом, в общем, где угодно! Так что если вы хотите, чтобы ваша программа имела престижную оценку от Тестовой лаборатории PC Magazine — обязательно отправьте ее в Библиотеку.

Но самое главное — если вы отправите в Библиотеку свою программу, то у вас появится шанс получить приз за нее, если ваше творение будет признано наилучшим. На сайте Microsoft Office Extensions проводится конкурс на лучшую разработку для Microsoft Office, и победителям этого конкурса выдаются вполне реальные призы, например, персональный компьютер или клавиатура с оптической мышью. Условия получения призов представлены на сайте конкурса. Фактически конкурс Microsoft Office Extensions является единственным местом в Сети, где разработчики бесплатных программ могут получить достойное вознаграждение за свой труд.

Когда вы наконец-то решите представить свою разработку на конкурс, то для начала посетите страницу http://www.microsoft.ru/offext/rules и загрузите с нее Лицензионное соглашение и Анкету разработчика, которые вам необходимо заполнить. Вы можете свободно изменять Лицензионное соглашение так, как вам заблагорассудится, но в Анкете должны указать точные данные. Помните, что оба этих документа будут распространяться вместе с вашей разработкой, так что не указывайте там слишком конфиденциальных данных.

Затем поместите вашу разработку, а также Анкету и Лицензионное соглашение в архив формата Zip и отошлите его в виде аттачмента по адресу offext@microsoft.com. В течение 24 часов вам должно придти потверждение получения вашей разработки, отправляемое автоматически. Если оно не пришло, то повторите отправку — видно, почтовые серверы сработали с ошибками.

Требования к представляемым программам немногочисленные и вполне разумные. Во-первых, программа должна работать в русской версии Microsoft Office XP. Во-вторых, она не должна повреждать какие-либо файлы системы или пользователя, не должна вызывать зависание системы.

Однако есть также и Пожелания Тестовой лаборатории PC Magazine разработчикам. Если представляемая программа им соответствует, то это повышает ее шансы на выигрыш в конкурсе. И вот какие это пожелания:

· Во-первых, программа должна хорошо выполнять свою функцию и работать программа должна надежно — не допускать непредсказуемости своего функционирования даже в случае не совсем адекватной работы самого Office.

· Во-вторых, программа должна работать корректно — то есть не допускать потери данных пользователя. Так, если программа не предназначена для изменения параметров текста, то она и не должна их менять.

· В-третьих, желательно, чтобы разработка имела удобный интерфейс и подробную документацию на русском языке.

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

· И, в-пятых, весьма желательно, чтобы разработка поставлялась с кодом, не закрытым от просмотра паролем. Во всяком случае, доверия тогда к разработчику будет больше, а значит, и вероятность получить приз выше.

Сайт "Высокие статистические технологии"

Есть в Интернете такой сайт — "Высокие статистические технологии". Казалось бы — посвящен он лишь сложным математическим методам и теориям, которые нужны лишь специалистам в этой области. Да, это в определенной степени так — значительная часть сайта содержит материалы по новому направлению математики — статистике обьектов нечисловой природы. Но есть на этом сайте и учебник по менеджменту, и полезные программы, и интересные статьи, и даже лекция об устройстве атомных реакторов. Впрочем, расскажем об этом ресурсе по порядку. Вот что вы там найдете:

· Статьи доктора технических наук, профессора А.И.Орлова, посвященные современным статистическим технологиям. Если вы являетесь специалистом в области статистических наук, то вас наверняка заинтересует рассказ о новом направлении математики — статистике обьектов нечисловой природы, позволяющей использовать статистические методы для обработки данных, не поддающихся переводу в числовые значения.

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

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

· Возможность подписаться на бесплатную электронную газету «Эконометрика», в которой рассказывается об этой науке, на наглядных примерах демонстрируются технологии прогнозирования экономической ситуации, оценки рисков, повествуется о применении эконометрики в экологии, менеджменте, управлении предприятием. Если вы учитесь в экономическом ВУЗе, желаете стать специалистом в своей области, то эта газета предназначена специально для вас.

· Учебник по менеджменту профессора А.И.Орлова. Он рассказывает о премудростях этой науки живым и легкодоступным языком и может служить как учебным пособием, так и просто интересной книгой. Учебник завоевал заслуженную популярность у студентов и преподавателей и был издан как часть учебного пособия по менеджменту. В настоящее время готовится его отдельное издание.

· Программы «ВерсткаТекстаКнижкой», «Untaco» и "Генератор иконок", о которых подробно рассказано в этой главе.

· Программу-дополнение для Microsoft Word 97/2000 «Каталогизатор», которая даст вам возможность создавать каталоги из гиперссылок на файлы в той или иной папке, а также web-страницы, содержащие картинки из какого-либо каталога. Ее удобно использовать, если вы желаете упорядочить свои файлы на жестком диске или создаете web-сайт.

· Набор дополнений для Microsoft Word 97/2000 «SaveIn». В этом наборе вы можете найти интересные технические решения и посмотреть, как они в нем реализованы. Кроме того, «SaveIn» поможет вам, если вы постоянно сохраняете копии рабочих файлов в нескольких разных папках.

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

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

Ну, а какой же адрес у сайта "Высокие статистические технологии"? Вот такой: http://antorlov.euro.ru. Есть и зеркало — http://www.newtech.ru/~orlov. Так что добро пожаловать в любое время дня и ночи. А если вы живете в Москве, то на заглавной странце сайта http://antorlov.euro.ru прочитайте, как получить к его зеркалу доступ бесплатно, не платя деньги провайдерам за пользование Сетью.

Глава 7. Напутствие

И под конец первой части книги, посвященной программированию в среде Microsoft Office, стоит сказать пару слов тем, кто все же заинтересуется этой темой.

Создавая программы на Visual Basic for Applications, вы сможете на опыте получить представление практически обо всех современных принципах программирования: как структурных — основанных на последовательном выполнении всех команд программы, так и «событийных», согласно которым программа должна реагировать соответствующим образом на действия пользователя. В современном программировании используются как структурный, так и событийный принципы: интерфейс программ построен по принципу реакции на события, а функции, выполняемые программой — по принципу независимой работы. Например, графический редактор Paint, да и тот же Word в большей своей части являются приложениями, управляемыми событиями — действиями пользователя; а, скажем, программы дефрагментации или проверки диска работают почти независимо от пользователя, он только должен задать им начальные параметры. В VBA можно писать как программы, управляемые событиями (посредством разработки форм), так и работающие последовательно и независимо (используя только модули), а также, разумеется, и приложения, сочетающие в себе оба способа действия.

VBA может служить не только полноценной средой разработки приложений, работающих в Microsoft Office, но и как бы "учебным центром" по освоению принципов и различных приемов современного программирования. Работа с системным реестром, с файловой системой и даже со встроенными в Windows функциями программирования API и многое другое, — все это вы сможете изучить на опыте, используя VBA, причем сделать это Вам будет значительно легче, чем если бы Вы сразу начали учиться программировать на Delphi или Visual Basic for Windows.

Средство записи макросов, возможность легкого анализа уже написанных программ (так как фактически любая программа на VBA распространяется вместе со своим исходным текстом), русский интерфейс редактора (к сожалению, только в Microsoft Office 97), большая и четко написанная справка, обилие примеров, — все это очень помогает в освоении этого языка и делает возможным его самостоятельное изучение даже без использования дополнительной литературы. Другие языки программирования так освоить практически невозможно. Кроме того, интерпретатор VBA обладает большими возможностями по коррекции ошибок, и поэтому программа на этом языке вряд ли вызовет ошибку системы и необходимость перезагрузки компьютера, если только не увлекаться вызовом функций API.

Если Вы научитесь программировать на VBA, поймете принципы разработки алгоритмов и основные приемы программирования, освоите среду написания программ — редактор VBA, то для Вас практически не составит труда начать создавать программы на Visual Basic for Windows. У этого языка абсолютно такой же синтаксис, такая же среда разработки с контекстной справкой и пошаговыми подсказками, на первый взгляд он отличается от VBA разве что набором доступных встроенных процедур и функций и отсутствием возможности записи макросов. Безусловно, есть и более глубокие различия, но при создании не очень сложных программ они не будут иметь большого значения. Вы сможете легко освоить средство разработки программ Delphi, хотя логика языка Pascal, лежащего в основе Delphi, несколько отличается от логики Visual Basic. Однако и среда разработки, и общие принципы программирования в Delphi те же. Несколько труднее будет освоить C++ и его производные из-за серьезно отличающегося синтаксиса и высокой сложности этого языка, но это не всегда необходимо, — подавляющее большинство проектов программ можно реализовать на Visual Basic или Delphi.

* * *

Среди тех, кто занимается программированием уже много лет и достиг в этом деле определенных высот, весьма распространено мнение, что VBA, да и Visual Basic — языки, на которых нельзя создать быстро и хорошо работающие программы. В определенной степени это соответствует действительности: программы на Visual Basic обычно работают несколько медленнее и занимают больше места, чем аналогичные им программы на С++, на Visual Basic весьма проблематично решение некоторых программистских задач и приемов. Поэтому профессиональные программисты часто считают, что Visual Basic — язык для дилетантов, а любой уважающий себя специалист в области информационных технологий обязан знать и использовать такие языки, как С++ или ассемблер. Но не следует забывать, что изначальное предназначение компьютерных технологий — помощь человеку в обработке и создании информации, а отнюдь не "служение самим себе", своему дальнейшему развитию. Поэтому основная функция большинства компьютерных программ — получение нужного результата, обработка вводимой информации, например, анализ электрокардиограммы или расчет траектории космической ракеты, а быстродействие, малый размер, да и удобство интерфейса — лишь их хорошие свойства, которые могут серьезно облегчить работу с программой.

Создать же программу, дающую действительно нужный результат, может лишь человек, непосредственно работающий в области, для которой данная программа пишется, — врач, инженер, астроном, математик. Только он знает все тонкости своего дела и сможет предусмотреть в программе все необходимые условия. Профессиональный программист же, хоть и имеет возможность создать программу, которая будет работать в несколько раз быстрее и занимать на диске значительно меньше места, чем написанная врачом или инженером, не представляет себе тонкостей области человеческой деятельности, для которой эта программа пишется, а поэтому, при всей внешней привлекательности, такая программа будет работать хуже, чем первая. К примеру, какая программа для анализа электрокардиограмм лучше: созданная опытным специалистом в области медицины, который посвятил всю свою жизнь исследованию электрокардиографии и энает все-все тонкости этого дела, или написанная не менее опытным программистом, который знает все языки программирования как свои пять пальцев, но, увы, не знаком с медициной? Даже если врач обратится к программисту с просьбой помочь ему написать эту программу, то он все равно не сможет посвятить того во все тонкости своего дела, чтобы отразить в программе все грани своего многообразного опыта, — на это может уйти слишком много времени и сил, да и нелегко программисту будет изучить совершенно незнакомую ему до этого сферу деятельности! Поэтому врач, немного знающий программирование, больше подходит для написания медицинской программы, чем профессиональный программист, немного знакомый с медициной. И пусть программа врача будет работать медленнее, пусть она будет занимать на диске в два раза больше места, пусть даже при ее создании будут нарушены все сложившиеся каноны программистского искусства, — все равно она сможет принести людям гораздо больше пользы, чем программа, прекрасно и хорошо написанная не знакомым с медициной человеком, так как только врач сможет поделиться с ней всем своим многогранным опытом.[16]

Отнюдь не всякий человек, превосходно умеющий лечить людей, сможет столь же превосходно освоить язык С++. И это нормально — у каждого свой талант, свои дарования. Но, благодаря стараниям сотен и тысяч программистов, зачастую безвестных, сейчас существуют среды программирования, освоить которые без проблем может каждый — те же Visual Basic и Delphi. И поэтому практически любой специалист своего дела может в наши дни использовать в своей работе новейшие достижения информационных технологий — создать нужную ему программу, разработав ее алгоритм на основе своего опыта. А для профессиональных программистов осталось не менее почетное и трудное дело — создавать такие среды программирования и новые языки, с которыми работать будет еще легче и быстрее, чем с существующими.

На вопрос: "Какой язык программирования лучше всего?" стоит отвечать так: "Тот, на котором ты можешь лучше всего писать программы и реализовывать свои проекты". Проще всего освоить Visual Basic и Delphi. И поэтому не стоит так уж стремиться обязательно знать ассемблер, выучить все функции API и жалеть, что не можешь вводить программы сразу в машинных кодах, — лучше повнимательнее изучить более простой язык даже вроде того же VBA для того, чтобы уметь использовать все его возможности для воплощения своих пожеланий в жизнь. Ну, а если кто желает посвятить свою жизнь информационным технологиям, создавать новые языки общения с компьютером, то тому знание Visual Basic никогда не помешает, а остальные знания, как говорится, дело наживное, — надо лишь начать учиться и освоить общие принципы.

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

* * *

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

Самостоятельно обучаясь использованию VBA, можно как бы на небольшой модели испробовать почти все исследовательские приемы, которые используются современной наукой, — и наблюдение, и анализ результатов, и эксперимент… Например, вынесение из записанного макроса неизвестной команды в отдельную процедуру для выяснения ее функции, — чем не эксперимент в контролируемых условиях? Или изменение параметров команды с целью узнать, к чему это приведет, — разве не так действуют исследователи, изменяя начальные условия эксперимента? Так что изучение VBA может стать целым "научным исследованием", в течение которого можно будет отработать основные приемы современного научного подхода.

Удачи вам в программировании!

Из мира Интернета

· В Интернете есть немало информации о программировании на VBA. Помимо Форума для разработчиков на сайте программы Microsoft Office Extensions (http://www.microsoft.ru/offext), обратите внимание на сайт Андрея Колесова и Ольги Павловой http://www.visual.2000.ru, на котором представлены статьи этих авторов о VBA, а также на литературу из сетевых библиотек

http://www.firststeps.ru, http://www.rusdocs.ru, http://www.emanual.ru и других.

Наверняка найдете немало полезного.

Список разработчиков VBA

Если вы хотите посмотреть имена тех, кто занимался разработкой языка VBA, создавал среду разработки — Редактор VBA или писал справочную систему, то сделайте следующее. Запустите Редактор VBA и выберите из меню «Вид» пункт "Панели инструментов — Настройка" (в английском варианте интерфейса соответственно пункт "Toolbars — Customize" из меню "View"). После открытия диалогового окна настройки панелей вы получите возможность переименовывать, удалять или добавлять пункты меню и иконки на панелях инструментов Редактора VBA.

Затем в режиме настройки откройте меню помощи (скрывается за вопросительным знаком или словом Help в строке меню) и переименуйте самый нижний его пункт — "About Microsoft Visual Basic" в английских версиях или "О программе" в русской, задав ему имя "Show VB Credits". Выйдите из Режима настройки, закрыв диалоговое окно.

Теперь, выбрав из меню помощи пункт Show VB Credits, вы увидите медленно плывущий снизу вверх список разработчиков на фоне крутящихся кубиков и приятной музыки. Клавиши стрелок управляют скоростью движения списка.

Данная возможность присутствует в Office 97 и Office 2000, но из Office XP она убрана.

Загрузка...