Андрей Колесов
"Хорошего работника узнают по инструменту"
Пословица
"Разумно взять инструмент и испытать его.
При неудаче честно признайтесь в этом и попробуйте другой инструмент.
Но главное - делайте что-нибудь."
Франклин Д. Рузвельт
Казалось бы, приложения, входящие в состав семейства Microsoft Office 2000, включают все, что нужно для самого взыскательного пользователя - выбирай нужный пакет и работай. Однако на самом деле это не совсем так.
Действительно, число офисных программ растет (пять лет назад в составе MS Office было четыре приложения, сегодня - девять), от версии к версии расширяется функциональность каждой из них. А конкретному пользователю все-таки постоянно чего-то не хватает. И такая ситуация является вполне естественной и легко объяснимой.
Во-первых, тут работает классический статистический закон 20/80 (одна из его прикладных формулировок: "20 процентов населения выпивает 80 процентов пива"). Каждый конкретный пользователь использует не более 10-20% имеющихся в программе функций. И это не означает, что приложение обладает избыточностью, включает что-то явно лишнее. Просто каждому пользователю нужно иметь свой индивидуальный набор этих "двадцати процентов". И для эффективной работы желательно, чтобы именно данный конкретный набор функций был "под рукой". (Так же, как часто применяемые справочники должны лежать на рабочем столе, редко используемые - в книжном шкафу или даже в дальней кладовке.)
Во-вторых, оказывается, что нужная пользователю операция выполняется каким-то не слишком оптимальным образом или в программе нет чего-то очень необходимого для работы.
Можно ли сделать офисную программу более удобной для конкретного пользователя? Можно ли автоматизировать выполнение часто повторяемых рутинных операций? Можно ли реализоваться в программе функции, которых в ней изначально вообще не было? Можно ли объединить разрозненные программы в единый комплекс?
Ответ на все эти вопросы один - "Да, можно!". На самом деле офисные программы вполне можно сравнить с айсбергом: пользователь видит только довольно небольшую "видимую" часть пакета, часто даже не подозревая, о существовании его "подводных" возможностях, с помощью которых он может сделать свое рабочее место более комфортным и эффективным.
Достигается, это тремя основными способами (мы их рассмотрим далее):
- Настройка интерфейса программы и создание простейших макрокоманд.
- Подключение к приложению готовых "расширений", разработанных кем-то другим.
- Создание собственных расширений, начиная от макрокоманд и заканчивая сколь угодно сложными приложениями.
Применение первых двух способов доступно абсолютно каждому пользователю с минимальным опытом работы. Третий требует определенных усилий по изучению программирования и минимального (в пределах неполной средней школы) знания английского языка. Далее мы пробуем показать в общих чертах подходы к реализации всех трех методов автоматизации своего рабочего компьютерного места, имея в виду, что более подробную информацию желающие могут найти в специализированных публикациях на эту тему.
Настройка интерфейса Word
Для работы с документом можно использовать свыше тысячи (!) различных встроенных операций Word. Обращение к ним выполняется с помощью команд меню или кнопок на панелях инструментов, расположенных обычно в верхней части экрана. Линейка меню включает только самые необходимые и часто используемые команды. Остальные команды разбросаны по 23-м встроенным панелям инструментов программы (в 1994 году Word 6.0 включал всего 8 панелей).
Очевидно, что для обычной работы с определенным типом документов пользователю достаточно всего несколько десятков команд, которые и должны быть представлены на экране. Для сохдания наиболее удобного варианта интерфейса можно применять разные вариаты найстройки.
Линейка меню, которая находится в верхней части окна среды Word, представляет собою особую панель - ее нельзя удались с экрана. Все остальные панели инструментов можно добавлять или убирать с экрана и помещать в любую его часть. Конечно, можно вывести на экран все панели инструментов, но тогда не останется места для самого документа (рис. 1). Вывод на экран нужного набора панелей проще всего выполняется с помощью команды Вид/Панели Инструментов (рис.2). Кроме того, для каждой панели можно указать набор кнопок, которые должны быть представлены в данный момент (рис. 3).
Рис. 1
Рис. 2
Рис. 3
Более широкие возможности настройки реализуются с помощью диалогового окна Настройка, которое вызывается командой Сервис/Настройка (рис. 4). В этом режиме пользователь может размещать на панелях инструментов любые команды (не только встроенные в панель изначально) и в любом месте, а также создавать собственные "пользовательские" панели, разместив на них произвольный набор кнопок. Все эти операции выполняются простым перетаскиванием мышью изображений кнопок. Таким образом, можно формировать собственный индивидуальный набор панелей инструментов, рассортировав на нем команды в нужном конкретному пользователю виде.
Рис. 4
Создание собственных макрокоманд методом записи
Итак, мы расположили все нужные для работы нам команды в оптимальном виде. Следующий шаг - автоматизация выполнения часто используемых последовательностей операций. Чтобы разобраться, о чем идет речь, давайте рассмотрим такой пример.
В редакции некоего журнала принят определенный стандарт для распечатки текстов статей, которые присылают по электронной почте авторы и с которыми должны работать далее редакторы. Например, это должен быть такой формат: тип шрифта - Arial, размер шрифта - 12, расстояние между строк - двойное, форматирование абзаца - с красной строки, отступ - 1 см. Подразумевается, что авторы присылают тексты в формате Word, но каждый тз них использует свой собственный набор параметров форматирования.
В ходе первичной обработки такого файла оператор (технический секретарь редакции) преобразовывает его формат к принятому стандарту и распечатывает документ. Все это выполняется по стандартной схеме:
- Открыть файл с документом, например, SomeFile.DOC.
- Выделить весь текст (команда Правка/Выделить все).
- Установить тип и размер шрифта (команда Формат/Шрифт, далее установка в диалоговом окне нужных параметров).
- Установить параметры форматирования абзаца (команда Формат/Шрифт, далее установка в диалоговом окне нужных параметров).
- Сбросить выделение текста (например, нажать клавишу Home для установки курсора в начало текста).
- Сохранить документ с тем же именем (команда Файл/Сохранить)
- Распечатать документ (команда Файл/Печать, далее нажать OK).
- Закрыть документ (команда Файл/Закрыть).
Так вот - можно сделать так, что вся эта последовательность операций будет осуществляться нажатием одной кнопки на панели инструментов. Делается это с помощью установки режима "Запись макрокоманды". Для этого выполните следующие операции:
- Откройте документ с текстом присланной статьи.
- Установите режим "Запись макрокоманды", выбрав команду Сервис/Макрос/НачатьЗапись. Сначала появится диалоговое окно, в котором нужно задать имя вашей макрокоманды, например, НашеФорматированиеДокумента (рис. 5). Здесь же можно сразу присвоить макрокоманде кнопку на какой-нибудь панели инструментов, а также комбинацию горячих клавиш для быстрого запуска операции (это можно будет сделать и потом в любое время).
- После установки режима записи на экране появится небольшая панель инструментов "Остановить запись" с кнопками управления процессом создания маркокоманды.
- Далее выполните с документом всю последовательность операций, указанную (выше пункты 2-8).
- Теперь отключите режим записи макрокоманды, нажав кнопку "Остановить запись" на одноименной панели.
Рис. 5
Все, теперь к тысяче встроенных команд Word прибавилась еще одна, которая выполняет специфическую, но очень полезную для вас операцию. Обработка всех других аналогичных файлов будет выполняться нажатием одной кнопки на панели инструментов (разумеется, команду можно разместить и в меню). То, что раньше требовало 20-30 секунд (и внимания человека!), теперь занимает не более 2-3 секунд.
ПРИМЕЧАНИЕ. Термин "макрокоманда" используется, чтобы подчеркнуть, что "макрокоманда" состоит из последовательности некоторый "простых" команд. В то же время часто подразумевается, что "команда" - это некоторая встроенная функция приложения, а "макрокоманда" - созданная пользователем.
Если вы много работаете с тестовыми документами, то наверняка легко обнаружите довольно много таких часто повторяющихся последовательностей операций. Автоматизируйте свою работу - создайте собственные макрокоманды с помощью записи своих действий.
Как устроена макрокоманда
Однако вы довольно быстро сможете столкнуться с ситуацией, когда метод записи не решит нужную вам задачу. Например, мне периодически нужно "почистить" диск, удалив с него ненужные документы. Для этого приходиться открывать в Word каждый документ, чтобы понять, стоит ли его оставить или следует удалить. В последнием случае нужно закрыть документ и уже потом, с помощью Проводника Windows, удалить ненужный файл. Все это очень неудобно - гораздо лучше сделать специальную макрокоманду, выполняющую сразу и закрытие и удаление документа. Но выполнить это с помощью записи действий нельзя, так как удаление файла производится вне Word с помощью другой утилиты Windows.
Чтобы понять подход к решению такой задачи, давайте посмотрим, как же реализована созданная выше макрокоманда НашеФорматированиеДокумента. Для этого выберите команду Сервис/Макрос/Макро, в появившемся диалоговом окне выделите имя макрокоманду и нажмите кнопку Редактирование. Через пару секунд вам откроется новое окно со средой программирования, которая VBA - Visual Basic for Applications (Visual Basic для приложений). Это и есть та самая огромная подводная часть айсберга MS Office, о которой мы упоминали в начале статьи (рис. 6).
Рис. 6
Обратите внимание, что среда VBA представлена в англоязычном варианте - ее создатель, корпорация Microsoft считает нецелесообразным локализацию для национальных языков средств программирования (с таким подходом можно вполне согласится).
Освоение VBA откроет для вас новые возможности офисных приложений и широкие перспективы для повышения эффективности своей работы. Мы же сейчас сделаем только маленький шажок для понимания открывающихся вариантов автоматизации Word.
В одном из окон среды VBA вы увидите программный код, который, как можно легко догадаться, выполняет созданную нами макрокоманду:
Sub НашеФорматированиеДокумента()
'
' НашеФорматированиеДокумента Macro
' Macro recorded 17.08.00 by Kolesov Andrei
'
Selection.WholeStory '2. выделить весь текст
Selection.Font.Name = "Arial" '3.тип шрифта
Selection.Font.Size = 12 '3. размер шрифта
With Selection.ParagraphFormat '4.установить параметры форматирования
.... ' абзаца
.OutlineLevel = wdOutlineLevelBodyText
End With
Selection.HomeKey Unit:=wdStory ' 5. сбросить выделение,
' курсор в начало
ActiveDocument.Save ' 6. сохранить документ
' 7. распечатать документ (тут задается много параметров
' диалогового окна Печать
Application.PrintOut FileName:="", Range:=wdPrintAllDocument, _
Item:= wdPrintDocumentContent, Copies:=1, Pages:="", _
PageType:=wdPrintAllPages, Collate:=True, Background:=True, _
PrintToFile:=False, PrintZoomColumn:=0, _
PrintZoomRow:=0, PrintZoomPaperWidth:=0, PrintZoomPaperHeight:=0
ActiveDocument.Close ' 8. Закрыть документ
End Sub
В приведенном здесь коде мы не показали около полутора десятков строк внутри конструкции With... End With - там производится тривиальная установка параметров диалогового окна ФорматированиеАбзаца. Даже не имея ранее дел с программированием, можно легко догадаться, что каждая строка этой небольшой программы соответствует одной операции, выполненной при записи макрокоманды. Минимальное знание английского языка позволит понять смысл команд, но мы на всякий случай написали русские комментарии. Если вы захотите подробнее узнать на назначении каждой команды и различных вариантах ее применения, то установите курсор на нужно слове и нажмите F1 (но вся справка Office/VBA 2000 реализована на английском языке).
Пишем макрокоманду "руками" - начинаем программировать
Теперь давайте попробуем написать необходимую нам макрокоманду удаления ненужного документа. Для этого вернемся в среду Word (переход из среды Word в VBA и наоборот выполняется нажатием комбинации клавиш Ctrl+F11). Далее откроем какой-нибудь документ и с помощью метода записи создадим макрокоманду "ЗакрытьУдалить", которая пока будет состоять только из одной операции - закрыть файл (команда меню Файл/Закрыть). Теперь перейдем в среду VBA и посмотрим код, сформированной нами макрокоманды. Если вы внимательно изучили содержимое предыдущей макрокоманды, то для вас не будет открытием то, что код новой будет выглядеть следующим образом:
Sub ЗакрытьУдалить()
ActiveDocument.Close
End Sub
Пока эта макрокоманда умеет только закрывать файл. Чтобы выполнить удаление файла нужно выполниться следующие операции
- узнать полное имя файла, который соответствует активному документу;
- запросить у пользователя подтверждение на операцию удаления (конечно, такой запрос можно и не делать, но хороший "тон" требует выполнить это);
- если пользователь подтвердил операцию, то закрыть и удалить файл.
Чтобы реализовать это, нужно сформировать такой программный код:
Sub ЗакрытьУдалить()
FileName$ = ActiveDocument.FullName ' полное имя файла
'активного документа
' запрос на подтверждение удаления
Result = MsgBox("Удалить файл " & FileName$ & " ?", vbYesNo, _
"Закрыть и удалить")
If Result = vbYes Then ' получен ответ "Да"
ActiveDocument.Close ' закрыть документ
Kill FileName$ ' удалить файл
End If
End Sub
Возможно, я сильно заблуждаюсь, но мне кажется, что приведенный здесь код не требует особых пояснений. Очевидно, что мы могли бы легко обойтись и без начальной записи макрокоманды, чтобы сформировать одну строчку кода. (Автономное создание новой макрокоманды выполняется такой последовательностью команд - Сервис/Макрос/Макро/Создать.) Приведу пример кода еще одной полезной макрокоманды, смысл которой отражен непосредственно в ее названии:
Sub ЗакрытьВсеОткрытыеДокументыЗаИсключениемАктивного()
Dim МойДокумент As Document
For Each МойДокумент In Documents ' перебираем все документы
If МойДокумент.Name <> ActiveDocument.Name Then 'имя совпало?
Documents(МойДокумент).Close 'Нет, закрыть документ
End If
Next
End Sub
Здесь хотелось бы обратить внимание читателей на особенность современных средств программирования - реализацию возможности их интуитивного понимания (об этом см. врезку "Изучать программирование - полезно для работы"). Действительно, текст программы очень похож на обычные разговорные логические обороты (только на английском языке). При этом смысл процедур и переменных можно отражать непосредственно в их именах. (Много лет назад были ограничения длины имен в 3 или 6 символов, поэтому приходилось иметь дело с терминами, которые с трудом поддавались простой интерпретации. Догадайтесь, что скрывается за именами тип, M10 или CVX). Для имен можно использовать русские символы, но ключевые слова языка в данном случае обозначаются только английским алфавитом.
ПРИМЕЧАНИЕ. Подобные механизмы внутреннего программирования приложений широко используют и российские разработчики приложений. Самый наглядный пример - технологическая платформа для решения разнообразных учетно-экономических задач "1С:Предприятие". В этой системе можно использовать в качестве синтаксиса языка программирования, как русский, так и английский язык.
В этом месте нужно сделать точку в разделе "начинаем программировать", так как здесь начинает безбрежное море возможностей расширения возможностей офисных приложений. Для их освоения нужно читать специализированные статьи, книги, документацию и пр. Но согласитесь - сделать простую, но полезную макрокоманду оказалось совсем не так сложно!
Подключение готовых расширений
Однако прежде чем писать свои макрокоманды, полезно уточнить - а нет ли уже готовых расширений, которые смогут решить ваши проблемы? Действительно, выше мы создали три макрокоманды, которые сохранились в глобальном шаблоне Normal.dot. Любой другой пользователь может переписать этот файл и применить наши разработки. Не говоря уже о том, что есть и другие, более удобные способы передачи расширений от одного приложения к другому.
На самом деле имеется огромное число таких программных дополнений для офисных приложений, некоторые из них распространяются на коммерческой основе, но огромное число - бесплатно. Нужно только знать, где их искать и как подключать. В качестве наиболее полного и самого известного русскоязычного Web-ресурса с такими программами можно уверенно посоветовать сервер - http://www.microsoft.ru/offext/
В течение последних трех лет российское отделение Microsoft проводит конкурс Office Extensions (офисные расширения) на лучшие разработки разнообразных дополнений для приложений MS Office. За эти годы лауреатами конкурса, получавшими ценные призы, стали несколько десятков человек, не только из России, но также - из стран ближнего и дальнего зарубежья. Библиотека общедоступных программ в настоящее время насчитывает около 300 самых разнообразных разработок, ежедневно услугами этой библиотеки пользуется несколько сот человек.
Мой совет: загляните на сервер Microsoft Office Extensions и вы наверняка найдете там что-то интересное и полезное для себя - программные расширения, которые сделают вашу работу с офисными приложениями еще эффективнее.
А в прошлом году на сервере появился еще один раздел, предназначенный для поддержки VBA-программистов. Поэтому, если вы хотите не только пользоваться чужими разработками, но и создавать свои собственные, то обязательно внимательно познакомьтесь с материалами, которые находятся по адресу http://www.microsoft.ru/offext/officedev/. Там находятся информационные ресурсы, которые пригодятся, как начинающим программистам, так и опытным разработчикам.
ПРИЛОЖЕНИЕ:
Изучать программирование - полезно для работы
"Программирование доставляет нам радость, потому что позволяет удовлетворить стремление к творчеству, глубоко заложенное в нас, и разделить это чувство радости с другими." Фредерикс Брукс, "Мифический человеко-месяц"
Еще лет десять назад, считалось, что каждый технический специалист должен уметь худо-бедно делать программы для ЭВМ для решения каких-то своих задач. В принципе такая постановка вопроса представляется совершенно верной, так как программирование - это, прежде всего, создание логического алгоритма для достижения желаемой цели. И в этом плане неважно, будет ли он реализован на ЭВМ или с помощью "ручных" способов. Другая сторона проблемы заключается в том, что даже если вы передавать задачу профессиональному разработчику (а не писать приложения сами), то знание основ программирования поможет правильно формулировать задание и, вообще, понимать "смежника".
Отмечу также, что довольно часто специалисту в какой-то предметной области легче освоить программирование, чем заставить разработчика "погрузиться" в прикладную тему (формального технического задания тут часто недостаточно). Особо следует выделить научных работников, занимающихся, например, исследованиями в области математических моделей: довольно часто построение и изучение моделей находится в неразрывной связи с процессом создания и отладки программы.
Однако итоги всеобщего обучения программированию студентов технических специальностей вряд ли можно назвать успешным. На практике получалось так, что тот, кто хотел практически делать программы, осваивал эту технологию самостоятельно. Абсолютное же большинство забывали о программировании вскоре после сдачи зачета. Так было в 80-х годах, так происходит и сейчас.
Причин этому довольно много. В 80-е годы (и раньше) освоение программирования напоминало изучение теории плавания без практических занятий на воде: учебные задания чаще всего проверялись преподавателями, а не компьютером. К этому нужно прибавить откровенно слабую методическую основу преподавания (я говорю сейчас о подготовке не профессионалов по вычислительной технике, а именно о специалистах других предметных областей), которое сводилось не к изучению программирования на примере некоторого языка, а к освоению синтаксиса языка без привязки к технологии построения алгоритмов и практической реализации программ.
За последние несколько лет компьютеры стали существенно доступнее, но ситуация с изучением программирования практически не улучшилась. Одна из причин этого - принципиальное сомнение в том, что его вообще нужно осваивать. Действительно, зачем учить программирование, если можно воспользоваться многочисленными готовыми приложениями? Поэтому, давайте просто обучать "компьютерной грамоте".
Да, такая постановка вопроса имеет рациональное зерно, но все же представляется довольно ограниченной.
Во-первых, программирование помогает лучше формулировать логику решения практически любой задачи (совсем не обязательно чисто вычислительной). Как говорили в старину, "арифметика мозги в порядок приводит".
Во-вторых, как раз расширение функциональности готовых программ с неизбежностью требует их более тонкой настройки и адаптации к нуждам конкретного пользователя. Использование методов программирования резко расширяет возможности решения этой задачи. Привлечение для этого профессиональных разработчиков часто просто не имеет смысл, так как сделать самому можно быстрее, чем идти в другое крыло здания для общения с коллегами. Тут все как с "обычной" грамотностью - в 19-м веке многие ходили к писарю, чтобы написать прошение, в 20-м считается, что написать связанный текст на одну страницу должен уметь каждый человек.
В-третьих, за десять лет совершенно радикально изменились инструменты разработки и технология их освоения. Эти средства стали существенно более понятными на чисто интуитивном уровне. Кроме того, радикально изменилась схема практической работы. Упрощенно говоря, раньше нужно было сначала изучить теорию программирования, чтобы написать даже простенькую программку, то сейчас серьезное освоение программирования начинается обычно после написания полезного приложения.
Иллюстрация этого тезиса приведена на примере программирования в среде программы Word 2000 - самого распространенного приложения семейства MS Office 2000 (но практически все сказанное будет годиться и для версии Office 97). Отметим при этом, что именно программирование с использованием офисных приложений открывает уникальные возможности освоения технологии разработки для "обычного" пользователя. Это объясняется тем, что он может буквально с первых шагов ощутить эффект для своей работы и затем поэтапно наращивать свои знания и навыки программирования. Но при этом нужно иметь в виду одну важную истину: для перехода к серьезной профессиональной разработки только опыта будет недостаточно -- в какой-то момент потребуется изучения теории.