Как использовать VBA для программирования в Word

5.1. Основные объекты Word

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

Ключевым в объектной модели Word является объект Application, так как он содержит все остальные объекты Word. Его элементами на разных уровнях иерархии являются около 180 объектов. Сам корневой объект Application имеет более сотни элементов: свойств, методов и событий.

Свойства объекта Word.Application

Свойства любого объекта делятся на две группы: свойства-участники (объекты) и терминальные свойства (обычные переменные VBA).

Единую систему организации панелей меню и инструментальных кнопок обеспечивает объект CommandBars, справок – Assistant, поиска – FileSearch.

Центральными объектами Word являются коллекции Documents и Templates, точнее составляющие их элементы, сам документ и шаблоны.

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

Объект AutoCorrect поддерживает работу по автоматической коррекции набираемых текстов. Его возможности эквивалентны команде Автозамена меню Сервис.

Объект Browser позволяет перемещать точку вставки, указывающую на объекты в документе.

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

Три объекта, связанные с проверкой грамматики и орфографии: Languages, Dictionaries, SpellingSuggestions, – позволяют установить нужный язык, выбрать словарь, в том числе пользовательские словари, а также работать со списком слов, предлагаемых для иборьбы при обнаружении ошибки правописания. Команды Правописание и Язык меню Сервис предоставляют аналогичные, функциональные возможности при работе с документом вручную.

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

Работа с документами и класс Document

Когда открывается приложение, создается коллекция документов Documents, содержащая все открытые документы. В начальный момент коллекция содержит минимум один новый или ранее существовавший документ. Новый документ добавляется методом Add, а уже существующий – методом Open объекта Documents.

Чтобы добраться до нужного документа, достаточно указать его индекс – имя файла, хранящего документ, или его порядковый номер в коллекции. Для той же цели можно использовать и метод Item, но обычно он опускается. Метод Save позволяет сохранить документ, а метод Close, сохраняя документ в файле, закрывает его и удаляет из коллекции.

Глобальное свойство Dialogs возвращает коллекцию диалоговых окон. Константа wdDialogFileOpen задает конкретное диалоговое окно – объект класса Dialog.

Классы, задающие структуризацию текста документа

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

Классы Characters, Words, Statements, Paragraphs, Sections позволяют работать с последовательностями (коллекциями) символов, слов, предложений, абзацев и разделов. Самой крупной единицей после абзаца выступает раздел. Элементом коллекций Characters, Words и Statements является объект класса Range. Объект Range позволяет работать как с одним элементом, так и с произвольной последовательностью элементов.

Документы, поддокументы, абзацы, разделы – все они имеют метод или свойство Range, возвращающее интервал, связанный с объектом. Поэтому работа с текстом так или иначе ведется через методы и свойства объекта Range.

События объекта Document

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

События объекта DocumentДокумент и его части

Рассмотрим основные классы, определяющие структуру документа.

1. Subdocuments (Subdocument) – коллекция и сам поддокумент. Есть некоторый разумный предел размера одного документа. Если в документе больше 10–20 страниц, работать с ним становится неудобно. В этом случае в нем выделяют главный документ и поддокументы. Главный документ в этом случае имеет коллекцию поддокументов, каждый из них является, по сути, документом, с которым можно работать независимо.

Метод AddFromRange класса SubDocuments создает поддокумент, выделяя из главного документа область, заданную параметром Range.

2. Tables (Table), TablesOfAuthoritiesCategories (T.O.A.C), TablesOfAuthorities (TableOfAuthorities), TablesOfContents (TablesOfContent), TablesOfFigures (TablesOfFigure). Класс Table определяет «обычные» таблицы с произвольным количеством строк и столбцов и произвольным заполнением полей. Остальные классы задают таблицы специального вида.

3. Shapes(Shape), InlineShapes(InlineShape) – эти две коллекции с их элементами позволяют добавлять в документ рисунки, но не только их. ActiveX– и OLE-объекты также являются элементами этих коллекций. Элементы этих двух коллекций отличаются тем, как они привязаны к документу: первые могут свободно перемещаться, вторые жестко привязаны к заданной области документа.

4. Lists(List), ListParagraphs(ListParagraph), listTemplates (ListTemplate) – списки удобно вводить в документ, когда имеешь дело с перечислением. Списки можно оформлять в соответствии с шаблоном. Существуют две группы шаблонов: нумерованные списки и списки-бюллетени. Коллекция ListTemplates содержит шаблоны оформления списков, а класс ListTemplate описывает конкретный шаблон.

Шаблон применяется к списку абзацев и придает ему структуру, заданную шаблоном. Коллекция Lists содержит те списки документа (списки абзацев), что оформлены как нумерованные списки или списки-бюллетени. Коллекция ListParagraphs представляет список абзацев всех списков документа.

Свойством ListParagraphs, которое возвращает объект соответствующего класса, обладает не только документ, но и объекты List и Range. Так что при наличии списка – объекта List можно выделить список абзацев. Чаще приходится выполнять обратную операцию – применять к списку абзацев один из возможных шаблонов, придав ему «настоящую» структуру списка. Тогда используют объект ListFormat.

5. Comments(Comment), Bookmarks(Bookmark), FootNotes (FootNote), EndNotes(EndNote), Fields(Field) – эти коллекции и их элементы отражают независимые, но близкие по духу понятия. Это части документа, косвенно связанные с ним. При нормальном просмотре документа они могут быть и не видны.

• Коллекция comments и класс comment задают комментарии. Комментарии, как известно, вводятся для пояснения тех или иных терминов или понятий документа. Формально они приписываются некоторой области – объекту range.

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

• Еще один способ комментирования – сноски. Они могут быть двух видов: подстраничные (внизу страницы) и концевые (в конце документа). Первые собраны в коллекцию footnotes, вторые – endnotes.

6. Fields (Field) – эта коллекция позволяет работать с полями документа. Одна из особенностей полей состоит в том, что их значения обновляются автоматически в зависимости от изменившихся внешних условий или контекста.

7. Story Ranges (Range) – эта коллекция представляет совокупность частей документа, называемых фрагментами (Story). Количество различных фрагментов документа фиксировано. Нельзя добавлять элементы в эту коллекцию обычным способом, используя метод Add. Фрагменты появляются в коллекции, когда создается соответствующая часть документа.

Фрагменты имеют тип, задаваемый константами из перечисления wdStoryType. Главный фрагмент – текст документа, тип которого задается константой wdMainTextStory. Комментарии, ссылки, колонтитулы составляют фрагменты других типов, т. е. сам фрагмент является объектом Range. Так что благодаря фрагментам можно, например, работать с коллекцией комментариев как с единой областью.

8. Variables (Variable) – с документом можно связать коллекцию переменных типа Variant. Это важная для программистов коллекция, так как время жизни переменных, в нее входящих, совпадает со временем жизни документа. Тем самым появляется возможность сохранять информацию о работе той или иной процедуры между сеансами. Например, можно иметь счетчики, подсчитывающие число вызовов макроса, и в зависимости от этого по-разному определять его дальнейшую работу.

Объекты Range и Selection

Объект Document имеет метод Range, возвращающий объект Range, и метод Select, создающий объект Selection. Метод Range – это функция, возвращающая как результат объект Range; метод Select – это процедура без параметров, которая создает объект Selection в качестве побочного эффекта. Объект Range имеет метод Select, превращающий область объекта Range в выделенную. Тем самым метод Select определяет новый объект Selection. Симметрично, объект Selection имеет свойство Range, возвращающее объект Range, соответствующий выделенной области.

Большинство ранее описанных частей документа являются и частями (свойствами) объектов Range и Selection.

Объект Range напоминает матрешку: в каждую область вложена область поменьше. Вот пример корректного (хоть и не самого эффективного) задания объекта Range:

Работа с текстом

Объекты Range и Selection позволяют выполнять основные операции над текстом: «выделить», «добавить», «заменить», «удалить». У наших объектов большой набор методов, позволяющих реализовать эти операции. Все рассматриваемые здесь методы принадлежат обоим объектам, если не сделана специальная оговорка.

Выделение

Выделить некоторую часть текста по существу означает определить объект Range или Selection. Объекты задают некоторую область в тексте документа, а их свойства Start и End позволяют установить начало и конец этой области. Меняя значения свойства, можно задать нужную область выделения.

Move является основным методом перемещения точки вставки. Остальные методы этой группы – в той или иной степени его модификации. Метод Move(Unit, Count) сжимает область в точку, стягивая ее в начало или конец, а затем перемещает точку вставки. Параметр Unit определяет единицы перемещения, a Count – количество этих единиц (по умолчанию 1).

Знак переменной Count задает направление стягивания и перемещения. Положительные значения этого параметра задают стягивание к концу и перемещение вперед, отрицательные – стягивание в начало и перемещение назад. Чистое стягивание без перемещения точки вставки задается как перемещение на одну единицу. Метод возвращает количество единиц, на которое фактически произошло перемещение, или 0, если оно не осуществлено. Параметр Unit принимает значения wdCharacter (по умолчанию), wdWord, wdSentence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow и wdTable.

Методы перемещения на сам текст не влияют – лишь изменяют область, заданную объектами Range и Selection. Поэтому эти методы применимы только к переменным типа Range, но не к фиксированным областям. Например, запись

не имеет эффекта, поскольку область первого абзаца – вещь неизменяемая. Метод Move стягивает область в точку, которая и перемещается, поэтому после его выполнения область исчезает, остается только точка вставки. Методы MoveStart и MoveEnd перемещают начальную или конечную точку области, обычно тем самым расширяя область.

Удаление текста

Метод Delete позволяет удалить текст. Вызванный без параметров, он удаляет вызывающий его объект Range или Selection. Если он применен в форме Delete(Unit,Count), удаляется часть текста в указанной области. Параметр Unit задает единицы, но при удалении возможны только два значения: wdWord и wdCharacter. Параметр Count задает количество удаляемых единиц.

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

Вставка текста

Группа методов Insert объектов Range и Selection позволяет осуществлять вставки в документ. Для вставки текста используются методы InsertBefore(Text) и InsertAfter(Text). Параметр text типа string задает текст, вставляемый до или после области, заданной объектами range или selection. После вставки текста область автоматически расширяется, включая в себя добавляемый текст.

Свойство Text позволяет заменять текст в выделенной области, поэтому нет нужды вызывать метод Insert(Text). Методы InsertBefore и InsertAfter безопасны, так как текст добавляется, не изменяя содержимого области. Совсем иное дело – методы вставки, которые далеко не безопасны. При вставке внутрь области, например при использовании метода InsertSymbol или InsertParagraph, заменяется содержимое области.

Работа с буфером

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

Иногда в буфер копируют не текст, а его формат. Этим занимается метод CopyFormat, копирующий формат по первому символу объекта selection. Если этот символ – метка абзаца, копируется формат абзаца. Методом CopyFormat обладает только объект selection.

Метод Paste позволяет поместить («приклеить») содержимое буфера в область, заданную объектами Range и Selection. Эта операция опасна, так как происходит замена, а не добавление текста. Поэтому обычно метод Paste применяется к объектам Range и Selection, предварительно стянутым в точку вставки. Метод PasteFormat применяет форматирование, хранящееся в буфере, к объекту Selection.

Например, создадим макрос, который вставляет список «урок, экзамен, сдал!», копирует его и помещает еще раз на лист.

Sub Макрос1()

With Selection.ParagraphFormat

Selection.TypeText Text:="Работа с текстом:"

Selection.TypeParagraph

With

ListGalleries(wdBulletGallery).ListTemplates(1)._ListLevels(1)

End With

End With

ListGalleries(wdBulletGallery).ListTemplates(1).Name = ""

Selection.Range.ListFormat.ApplyListTemplate

ListTemplate:=ListGalleries(wdBulletGallery).ListTemplates(1), ContinuePreviousList:=False, ApplyTo:= _wdListApplyToWholeList, DefaultListBehavior:=wdWord10ListBehavior

Selection.TypeText Text:="урок"

Selection.TypeParagraph

Selection.TypeText Text:="экзамен"

Selection.TypeParagraph

Selection.TypeText Text:="сдал"

Selection.TypeParagraph

Selection.Range.ListFormat.RemoveNumbers

NumberType:=wdNumberParagraph

Selection.TypeParagraph

Selection.Font.Bold = wdToggle

Selection.Font.Italic = wdToggle

Selection.TypeText Text:="Работа завершена!"

Selection.WholeStory

Selection.Copy

Selection.PasteAndFormat (wdPasteDefault)

Selection.PasteAndFormat (wdPasteDefault)

End Sub

5.2. Форматирование документа

Работа с текстом (продолжение)

Наиболее важной особенностью работы на VBA в Word является вставка текста в документ при работе с приложениями. Для этого служат объекты Range и Selection, которые являются главными для практически любых операций, которые можно выполнять с помощью Word VBA. Некоторые из этих действий можно применять к документам в целом, но в общем случае вам необходим диапазон или выделенная область, прежде чем вносить изменения. Мы, однако, рассмотрим действия с документом при его создании.

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

Причем данная строка будет расположена в конце существующего параграфа. С другой стороны, используя объект Selection, можно Вставить некоторый текст в документ, используя метод Add и присвоение свойства Text объекту Selection:

If Documents.Count = 0 Then Documents.Add

Selection.Text i_098.png"/>

Рис. 64. Форма ввода данных

При работе с текстом на рабочем листе Word необходимо знать следующие коды:

определение цвета

Selection.Font.Color =

определение жирности

Программирование в Word: зачем, почему?

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

Однако если подобная деятельность производится с некоторой периодичностью, пытливый ум сразу начинает думать о способах оптимизации своего труда. Одним из таких способов является программирование в среде Visual Basic for Applications,- среде разработки, которая встроена в известные офисные продукты: Word, Excel, PowerPoint и т.д. Статья больше вводная, для тех, «кто совсем не в теме» :-).

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

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

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

В открывшемся окне перейти в настройку ленты:

Далее, в правом окне, под названием «Основные вкладки», поставить галочку рядом с опцией «разработчик»:

В результате этих действий на ленте сверху у вас появится вкладка «разработчик»:

Войдя в которую, в левой части, вы как раз и сможете найти две интересующие нас опции: «Visual Basic» и «Макросы»:

Соответственно, далее если мы нажимаем на кнопку «Запись макроса», то мы сможем записать нашу последовательность действий:

Созданный макрос можно сохранить либо в конкретном документе, либо сделать его доступным для всех документов (если сохраним его в шаблоне normal.dotm):

После чего, записанный макрос может быть воспроизведён, если мы перейдём, нажав на кнопку «Макросы»:

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

  • правка кода уже имеющегося макроса
  • написание кода с нуля.

Это приведёт к запуску среды разработки, где вы сможете увидеть свой записанный макрос в виде кода. Кстати говоря, это является одним из интересных лайфхаков, когда недостаточное знание программирования на VBA вы подменяете сгенерированным кодом макроса и реверс-инжинирингом, с попыткой вникнуть, «а как оно там внутри устроено?»:

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

Среду разработки можно вызвать нажатием сочетания клавиш Alt+F11, после чего, написав нужный код, запустить его прямо из среды разработки.

Список готовых макросов можно вызвать нажатием сочетания клавиш ALT+F8.

Visual Basic for Applications(VBA) Как мы уже говорили, разработка кода для приложений Office ведётся с использованием специального кода, который является версией интерпретируемого языка Visual Basic (несколько упрощённой его версией).

Благодаря использованию объектной модели компонентов (COM), могут применяться компоненты, используемые в ряде программ одновременно, для этого используется технология OLE (Object Linking and Embedding), суть которой заключается передаче части работы от одной программы к другой (в рамках среды Windows), и получение обратно результата.

Это означает, что теоретически, вы можете на VBA написать программу, которая будет использовать, например, средства Photoshop или Corel Draw, если конечно они установлены у вас на компьютере (однако, есть подозрение, что для этого потребуется более расширенная версия языка, чем тот, который идёт в комплекте с пакетом Office).

В рамках VBA объекты представлены в виде иерархии: Application/Document/Paragraph и т.д., то есть, как можно видеть в этой строке, каждый предыдущий — содержит последующий.

Получается своего рода «матрёшка», где одно вложено в другое и, если задуматься, это достаточно логично.

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

Согласно этому источнику, несмотря на то, что Word содержит множество объектов, по большому счёту, для успешной работы достаточно понимания всего лишь 5 объектов:

  • Application
  • Document
  • Selection
  • Range
  • Bookmark
  • мы запустили Word (Application),
  • создали или открыли в нём документ(Document),
  • дальнейшие манипуляции в этом документе происходят либо с постановкой курсора в определенное место, либо с выделением определённого места в документе(Range).

Каждый из перечисленных выше объектов, имеет свой набор свойств и методов.

Более подробно о их сути вы можете почитать вот здесь.

В свою очередь, наиболее полный список всех объектов, с их описанием вы можете найти вот здесь.

Вкратце, любая программа на Visual Basic представляет собой сочетание приложения (в нашем случае Word), среды разработки и модулей.

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

Для создания модуля, всего лишь нужно перейти в соответствующий шаблон (например, если мы создаём модуль, который должен быть доступен для всех документов, мы создаём его в шаблоне Normal). Для этого нажимаем на папке Microsoft Word Objects — правой кнопкой мыши и проходим по пути:

  • подпрограммы
  • функции (предназначены для вычисления конкретного значения).

Sub имя_подпрограммы ([Параметры]) Тело подпрограммы End Sub

Структура функции выглядит следующим образом:

Sub имя ([Параметры]) Тело функции имя=выражение End Sub

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

Sub TextFinder ([Параметры]) Тело функции TextFinder=Selection.Find.found End Sub

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

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

Visual Basic for Applications является объектно-ориентированном языком программирования и полностью поддерживает постулаты этой концепции.

Типичная команда выглядит как разделённая точками в стиле ООП, где мы спускаемся по иерархии в самый низ, — до конкретного действия:

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

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

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

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

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

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

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

Но тут есть один нюанс: как вы могли видеть выше, программа начинает исполняться с самого начала. Но программа может быть достаточно длинной! Как сделать так, чтобы можно было провести, условно говоря, «юнит-тест» участка программы, который находится не в самом начале?

Для этого нужно всего лишь кликнуть в серую зону слева от программы — и там появится красная метка. Она означает то место, с которого стартует выполнение кода. Теперь, если мы нажмём на F8, — начало исполнения перескочит на эту метку:

Вообще говоря, программирование на VBA может быть достаточно мощной штукой, так как позволяет не только писать некие простые макросы, но даже и создать свой программный продукт, для генерации каких-либо отчётов или форм (и не только). Да, конечно, я сам имею такую слабость, — не желая изучать имеющиеся у продукта инструменты, пытаюсь решить проблему собственными знакомыми костылями (ну, знаю я, например, Java, — значит, буду решать проблему в рамках этого языка, игнорируя встроенные возможности Word). Однако, это не совсем правильный подход, так как «ученье — свет» :-).

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

P.S. Вот мы тут гоняемся за интеллектуальными IDE, модными актуальными языками… А может вот оно, а? 🙂

Будет очень интересно почитать в комментах, если кто то из читателей использовал неким интересным образом программирование под word в VBA и какие результаты это дало!

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

Форматировать хитро: первую строку выделить, первый столбец — искать в каждой строке диапазон битов регистра, вида [12:0], если найдено — применить стиль; такая же сложная логика форматирования по всей таблице (поиск определённых участков и их оформление. Скажем, таблица на 50 строк форматировалась… Секунд 15-20. Вручную — до бесконечности (в зависимости от лени и загруженности работой). Так что, макросы имеют право на жизнь!

  • vba
  • программирование в word
  • Visual Basic for Applications
  • ООП
  • Программирование
  • Читальный зал

Введение в программирование для Word

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

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

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

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

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

  1. Поле отображения текста — отражает текстовую информацию (рис. 2).
  2. Поле ввода текста — позволяет пользователю ввести текстовую информацию (рис. 3).
  3. Несколько видов списков — средства выбора варианта наподобие ниспадающего перечня шрифтов в Word (рис. 4).
  4. Флажок — элемент, который может находиться в трех состояниях: включенном, выключенном (это устанавливается как пользователем, так и программистом) или неактивном (определяется программой) (рис. 5).
  5. Переключатель — элемент, который также может находиться во включенном, выключенном и неактивном состоянии. В отличие от флажка, переключатели должны быть объединены в группы с помощью элемента «рамка». Если же один из группы включен, то остальные уже не могут быть в таком состоянии (рис. 6). В Microsoft Word есть диалоговые окна, которые содержат как флажки (принято называть «функции». — Прим. ред.), так и переключатели. Кстати, почти все закладки меню «Сервис?Параметры» состоят из флажков, а меню «Вставка? Сноска» — из переключателей.
  6. Выключатель — кнопка, которая может находиться в нажатом или отжатом состоянии. Например, в Word кнопки предназначены для представления скрытых символов или создания списков (рис. 7).
  7. Рамка — отражает прямоугольник с заголовком, используется в основном для объединения групп переключателей.
  8. Командная кнопка — обычная, наподобие кнопки OK или «Отмена» в любом диалоговом окне (рис. 8).
  9. Набор вкладок и 10-й элемент — наборы страниц, которые представляют комплект страниц-вкладок, схожих с закладками «Общие», «Сохранение», «Печать» и другими в диалоговом окне Word «Сервис?Параметры». Отличие между этими двумя элементами (т. е. набором вкладок и 10-м элементом) состоит в том, что 9-й при переключении на другую страницу не затрагивает остальные элементы формы, даже когда они находятся на нем, а изменить состояние других элементов можно только программно. Десятый же элемент при своем переключении принудительно (т. е. вне зависимости от программы) скрывает элементы на одной своей странице и показывает на другой. Чтобы лучше понять разницу между этими двумя типами элементов, создайте форму с каждым из них и посмотрите, как они работают, — при переключении закладок в 9-м элементе на них самих ничего меняться не будет, а при использовании 10-го элемента на каждой новой закладке вы можете разместить свой, отдельный набор элементов. Так, 9-й элемент может использоваться в какой-либо программе, в частности базе данных, отображая вкладки с именами сотрудников. На каждого из них в нескольких полях есть стандартная текстовая информация, и число этих полей для всех одинаково. В этом случае разумнее будет использовать именно 9-й элемент, соответственно изменяя содержимое полей с текстом при переключении вкладок, чем создавать с помощью 10-го элемента набор страниц с отдельными полями текста на каждой из них, что резко увеличивает объем программы и усложняет ее. К сожалению, в настоящее время нет единой номенклатуры этих двух элементов форм VBA, поэтому в справочной системе и литературе можно встретить разные названия для каждого из них (рис. 9).
  10. Полоса прокрутки — аналогична той, что есть в Word. Может передавать в программу число, равное расстоянию в пунктах от ее начала. Верхний предел расстояния неограничен (рис. 10).
  11. Счетчик — две кнопки со стрелками. Может передавать в программу свое значение от 1 до 100 (рис. 11).
  12. Рисунок — в этот элемент можно вставить из файла рисунок, который будет храниться в форме (и шаблоне с ней) (рис. 12, 13).
Рис. 2
Рис. 3
Рис. 4
Рис. 5
Рис. 6
Рис. 7
Рис. 8
Рис. 9
Рис. 10
Рис. 11
Рис. 12

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

Рис. 13
Рис. 14

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

Private Sub CommandButton1_Click() End Sub

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

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

Рис. 15

Некоторые события имеют параметры, которые передаются программе. Так, процедура обработки события 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 — например, выбор пользователем значения из списка позволяет каждый раз выводить в форму какой-либо текст, неодинаковый для разных значений. Наиболее часто динамические формы применяются для отключения элементов, которые не могут быть использованными при каких-либо условиях. Например, в форме, состоящей из поля ввода текста и кнопки, вызывающей процедуру вычисления квадратного корня, кнопка может становиться неактивной при написании в поле ввода отрицательного числа.

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

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

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

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

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

Если нужно повторить ту или иную группу операций несколько раз, то используются такие операторы цикла, как Do. Loop, For. Next и For Each. Next. А если требуется совершить какие-либо действия в зависимости от наличия определенных условий, а также от значения той или иной переменной, то применяются операторы условия: If. Then.

Else и Select Case.

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

Более подробное описание функций, особенностей и синтаксиса всех операторов можно получить в справочной системе Visual Basic for Applications.

Это пригодится

  • Чтобы ускорить выполнение работающей с текстом программы, рекомендуется почаще использовать команду ActiveDocument. UndoClear, которая позволяет очистить список выполненных команд (однако делает невозможной отмену последних изменений).
  • Чтобы система не тратила время и ресурсы на постоянное обновление экрана и отображение изменений и чтобы выполнять визуальный контроль происходящих изменений, поставьте в начало программы команду Application. Screen Updating = False, а в конец — команду Application.ScreenUpdating = True.
  • Если возникает нестандартная ошибка, то с помощью команды On Error goto «имя метки» можно заставить программу переходить к указанной метке, а поставив перед каким-либо фрагментом программы команду On Error Resume Next, можно приказать ей (при возникновении ошибки) начать выполнение следующей команды.
  • Чтобы пользователь мог вносить в программу определенные данные (кроме создания форм), можно применить встроенные диалоги Visual Basic — диалоговое окно «Открытие файла», «Свойства документа» и др. Они вызываются следующими командами: Dialogs(«Название диалога»).Show — показывает диалог и выполняет соответствующие ему действия; Dialogs(«Название диалога»).Display — только демонстрирует диалог и позволяет записать в переменные введенные изменения, однако никаких действий не выполняет и ничего не изменяет; Dialogs(«Название диалога»).Execute — ничего не отображает на экране, но применяет все изменения, сделанные ранее по команде With Dialogs(«Название диалога»). End With). Чтобы получить список возможных диалогов, наберите Dialogs(. К сожалению, в справочной системе нет описания конкретных диалогов, поэтому придется отображать каждый.
  • Можно в любой момент прервать работу макрокоманды, нажав клавиши и .

О шифровании и паролях

Защита доступа к информации с помощью пароля — самый распространенный способ хранения секретов на ПК. Она используется практически везде — начиная с задания пароля на вход в Internet и заканчивая установкой пароля на проекты VBA. Однако о принципах такой защиты большинству пользователей известно довольно мало. Вот некоторые сведения.

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

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

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

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

1001010101001110010101010011 10010101010011100101010100111001.

Далее шифруем, применяя к этим двум последовательностям функцию XOR: 01000000000101001 10011111000011111111111 00001111110111010011.

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

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

Успехов вам в программировании!

Функция XOR
1-й вход 2-й вход Результат
000
101
011
110
Оцените статью
InternetDoc.ru
Добавить комментарий