Программирование на VBA в Word. VBA Word, как это делается

ГЛАВА 10

Программирование в Word

10.1. Зачем программировать в Word

Word - старейшее и самое популярное приложение, входящее в состав Microsoft Office. В большинстве организаций пользователи готовят документы именно в Word.

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

Автору приходилось создавать приложения с отчетами, разработанными в самых разных программных продуктах - Microsoft Access, Crystal Reports, Microsoft Reporting Services и т. д. Если ваше приложение генерирует отчеты к базам данных в Microsoft Word, то, скорее всего, такие отчеты будут не самыми быстрыми, с точки зрения их формирования, и не самыми простыми, с точки зрения программирования. Зато совершенно точно они будут самыми дружелюбными по отношению к конечному пользователю. Почему?

Очень часто на предприятии возникает необходимость исправить в форме отчета всего пару строк - например, вместо "Директор" поставить "И. О.

Директора". Если отчет создан в Crystal Reports или в Microsoft Reporting Services, придется срочно обращаться к разработчику. А через какое-то время И. О. утвердят в должности директора, и разработчику придется править отчет снова.

Если же отчет изначально создается в документе Word, то пользователь всегда может сам внести в созданный документ необходимые изменения - по-

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

У Word есть и другие преимущества. Как правило, при изготовлении отчетов

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

в Word, чем, к примеру, в Crystal Reports или Reporting Services.

Еще одно программное применение Word - умение работать с разными форматами документов. Эту возможность Word вполне можно использовать для массовой обработки документов.

Приведу случай из практики: в каталоге на диске у нас собралось несколько сотен "разнокалиберных" документов разных пользователей. Часть из них создана в Word разных версий, часть - просто текстовые файлы, некоторые документы в форматах HTML, XML или EML (сообщения электронной почты). На предприятии внедрена система документооборота на основе SharePoint Portal Server и нам необходимо привести все эти документы к еди-

ному формату (Word 2003) и загрузить их на SharePoint Portal Server. Конечно же, без автоматизации в такой ситуации возиться придется очень долго.

Третье программное применение Word - форматирование документов, например: программное применение стилей, поиск и замена участков текста сразу во многих документах, работа со структурой документа и т. п. Обычно такие задачи ставятся в издательствах, например, при подготовке рукописей.

10.2. Введение в программирование в Word. Объектная модель

Общая структура объектов Word выглядит так, как показано на рис. 10.1.

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

объект Application;

объект Document (с коллекциейDocuments );

объект Selection;

объект Range ;

объект Bookmark (с коллекциейBookmarks ).

Программирование на VBA в Word

Вывод текста в документ Word

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

Объект Word.Application

Дополнительно ко всем возможностям программирования на 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 может реагировать на три события, возникающие в результате действий пользователя.

Таблица 16

События объекта 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:

ActiveDocument.Range.Sections(1).Range.Paragraphs(l).Range.Sentences(1). Words(1).Characters(1)

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

Объекты 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, но не к фиксированным областям. Например, запись

ActiveDocument.Paragraphs(l).Range.Move

не имеет эффекта, поскольку область первого абзаца – вещь неизменяемая. Метод 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

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

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.PasteAndFormat (wdPasteDefault)

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

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

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

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

ActiveDocument.Paragraphs(1).Range.Text = «Oxo-xo!!»

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

Selection.Text = "Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, « + TextBox1.Text +», и отвечает запросам всех программистов!»

В результате выполнения данного программного кода в документе Word будет выведена строка:

Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, Светлана, и отвечает запросам всех программистов!

Здесь имя Светлана, например, считано с текстового поля некоторой формы, имеющей всего одно поле ввода для имени и кнопку «Вывод текста» (рис. 64).

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

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

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

Selection.Font.Color =

wdColorRed – красный

wdColorDarkRed – бордовый

wdColorDarkTeal – бирюзовый

wdColorBlue – синий

wdColorGreen – зеленый

wdColorBlack – черный

wdColorOrange – оранжевый

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

Selection.Font.Bold =

wdToggle – жирность

определение начертания

Selection.Font.Italic=

wdToggle – курсив

определение выравнивания

Selection.ParagraphFormat.Alignment=

wdAlignParagraphRight – выравнивание по правому краю

wdAlignParagraphCenter – выравнивание по центру

wdAlignParagraphJustify – выравнивание по левому краю

вставка в текст конкретного предложения

Selection.TypeText Text:="Пример работы с текстом"

вставка новой пустой строки

Selection.TypeParagraph

установка размера букв

Selection.Font.Size = 14

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

Одним из элементов оформления диалоговых окон является элемент управления Image (рисунок). Его основные свойства:

Autosize – изменяет размер рисунка на форме (автоматически или нет);

Picture – отображает графический файл, выводимый на форму;

pictureSizeMode – устанавливает масштабирование рисунка (не весь рисунок, вся поверхность объекта, целиком внутри объекта);

PictureAligment – устанавливает расположение рисунка внутри объекта (слева, справа, вверху, внизу);

pictureTilling – покрывает объект мозаикой из рисунка.

Данные свойства либо устанавливаются в окне свойств объекта, либо прописываются в листинге.

Пример 30. Создать программу, которая будет производить подсчет количества теплоты, выделяемой в проводнике при протекании в нем тока. Формула для расчета количества теплоты известна под именем закона Джоуля – Ленца:

где Q – количество теплоты в Джоулях;

U – напряжение в вольтах;

t – время в секундах;

S – площадь поперечного сечения проводника в квадратных миллиметрах;

l – длина проводника в метрах;

р – удельное сопротивление материала проводника в Ом? мм 2 /м.

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

Технология выполнения

Создайте форму по приведенному рис. 65.

Рис. 65. Разработанная форма примера 30 в рабочем состоянии и вывод результирующих сведений в документ word

При создании формы установите необходимые свойства элементов. Установите свойство Locked элемента TextBox6 как True, чтобы не допустить случайного ввода пользователем в него текста.

Описание процедур

Private Sub CommandButton1_Click()

If Documents.Count = 0 Then Documents.Add

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

Selection.Collapse direction:=wdCollapseEnd

Private Sub CommandButton2_Click()

Private Sub TextBox1_Change()

Private Sub TextBox2_Change()

Private Sub TextBox3_Change()

Private Sub TextBox4_Change()

Private Sub TextBox5_Change()

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

TextBox6.Text = ""

CommandButton1.Enabled = False

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

Функция Str делает преобразование, обратное тому, что производит Val, – конвертирует числовое значение выражения в строковое, что позволяет этому значению в дальнейшем обрабатываться как строке.

Таким образом, функции Val и Str преобразуют типы данных обрабатываемых ими переменных, соответственно, из строкового в числовой и из числового в строковый (см. главу 3).

Создание кнопки или панели в Word

Назначить форме кнопку или пункт меню для непосредственного вызова приложения из Word нельзя – это можно сделать только для модулей. Поэтому нужно применить следующий способ. Создайте макрос (Меню + Insert + Module) в открытом проекте:

Переименуйте этот макрос по своему усмотрению, например Teplo. И выполните следующие действия.

1. Щелкните правой кнопкой мыши в любом месте панели инструментов.

2. В этом меню выберите команду Настройка (или Сервис + Настройка).

3. В диалоговом окне Настройка щелкните на ярлыке вкладки Команды .

4. Прокрутите список Категории вниз и найдите пункт Макросы . Выберите этот пункт. В списке «Сохранить в» выберите имя вашего документа, в котором создан макрос (рис. 66).

Рис. 66. Поиск макроса для создания кнопки

5. В правом окне найдите необходимый макрос (либо VBA-программу).

6. Перетащите имя этого макроса или программы на панель инструментов.

7. Создайте соответствующую надпись кнопки и, если нужно, рисунок (при помощи правой кнопки мыши).

8. Закройте диалоговое окно Настройка, чтобы завершить работу.

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

Задачи на закрепление материала

Пример 31. Создать программу, позволяющую заполнять стандартные заявления студентов учебного заведения, если все необходимые данные заполняются в соответсвующих текстовых полях формы, а причина пропусков занятий выбирается из раскрывающегося списка (рис. 67, 68).

Рис. 67. Разработанная форма примера 31 в рабочем состоянии

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

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

Классному руководителю

группы АС-42

Сидорову О.И.

от студента(ки)

Петренко Олега Ивановича

Заявление Петренко Олег Иванович 18.05.2007

Рис. 68.

Полученный результат вычисляется по формуле:

Результат = расстояние * (потребление бензина на 100 км) / 100*цену бензина за литр.

Учесть, что если выбрали условие поездки «на чужой машине», то цена бензина равняется 0 руб.

Рис. 69. Разработанная форма примера 32 в рабочем состоянии

Также учесть, что если при вычислении результат превысит 400 руб., то выдать сообщение «Может, пойдем на рынок?».

При создании формы придерживаться рис. 69, при выводе текста в документ Word – рис. 70.

При поездке на дачу, находящуюся на расстоянии 55 км, при цене бензина за литр 18,50 руб., потребление бензина составит 101,75 руб.

Рис. 70.

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

Рис. 71. Разработанная форма примера 33 в рабочем состоянии

При вычислении придерживаться следующих формул:

если схема вычисления простая, то

Доход = внесенная сумма + внесенная сумма * процентную ставку/100*срок/360;

если схема вычисления сложная, то

Доход = внесенная сумма + внесенная сумма * процентную ставку/100*срок/360 +0,01*(внесенная сумма * процентную ставку/100*срок/360).

При разработке интерфейса формы опираться на приведенный рис. 71, а при выводе расчетов в документ Word – рис. 72.

Отчет о доходе

На настоящий момент гражданин(ка) Евсеева Ольга Константиновна имеет на своем счету по простым процентам при начальной сумме вложения 1000 руб. за 150 дней при 2 %-ной ставке 1008,33 руб.

Рис. 72. Примерный формат вывода расчетов в документ word

Результат вычислений с соответствующими пояснениями выводится в документ Word, а в поле формы выдается числовой результат произведенных расчетов.

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

При работе придерживаться приведенных рис. 73 и 74.

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

Рис. 73. Разработанная форма примера 34 в рабочем состоянии

Рис. 74. Примерный формат вывода заявления в документ word

Объект Word.Application

Дополнительно ко всем возможностям программирования на 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 может реагировать на три события, возникающие в результате действий пользователя.


Таблица 16

События объекта 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:

ActiveDocument.Range.Sections(1).Range.Paragraphs(l).Range.Sentences(1). Words(1).Characters(1)

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

Объекты 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, но не к фиксированным областям. Например, запись

ActiveDocument.Paragraphs(l).Range.Move

не имеет эффекта, поскольку область первого абзаца – вещь неизменяемая. Метод 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

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

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.TypeText Text:="Работа завершена!"

Selection.WholeStory

Selection.PasteAndFormat (wdPasteDefault)

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

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

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

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

ActiveDocument.Paragraphs(1).Range.Text = «Oxo-xo!!»

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

Selection.Text = "Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, « + TextBox1.Text +», и отвечает запросам всех программистов!»

В результате выполнения данного программного кода в документе Word будет выведена строка:

Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, Светлана, и отвечает запросам всех программистов!

Здесь имя Светлана, например, считано с текстового поля некоторой формы, имеющей всего одно поле ввода для имени и кнопку «Вывод текста» (рис. 64).


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


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

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

wdColorRed – красный

wdColorDarkRed – бордовый

wdColorDarkTeal – бирюзовый

wdColorBlue – синий

wdColorGreen – зеленый

wdColorBlack – черный

wdColorOrange – оранжевый


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

wdToggle – жирность


определение начертания

wdToggle – курсив


определение выравнивания

Selection.ParagraphFormat.Alignment=

wdAlignParagraphRight – выравнивание по правому краю

wdAlignParagraphCenter – выравнивание по центру

wdAlignParagraphJustify – выравнивание по левому краю


вставка в текст конкретного предложения

Selection.TypeText Text:="Пример работы с текстом"

вставка новой пустой строки

Selection.TypeParagraph

установка размера букв

Selection.Font.Size = 14

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

Одним из элементов оформления диалоговых окон является элемент управления Image (рисунок). Его основные свойства:

Autosize – изменяет размер рисунка на форме (автоматически или нет);

Picture – отображает графический файл, выводимый на форму;

pictureSizeMode – устанавливает масштабирование рисунка (не весь рисунок, вся поверхность объекта, целиком внутри объекта);

PictureAligment – устанавливает расположение рисунка внутри объекта (слева, справа, вверху, внизу);

pictureTilling – покрывает объект мозаикой из рисунка.

Данные свойства либо устанавливаются в окне свойств объекта, либо прописываются в листинге.


Пример 30. Создать программу, которая будет производить подсчет количества теплоты, выделяемой в проводнике при протекании в нем тока. Формула для расчета количества теплоты известна под именем закона Джоуля – Ленца:

где Q – количество теплоты в Джоулях;

U – напряжение в вольтах;

t – время в секундах;

S – площадь поперечного сечения проводника в квадратных миллиметрах;

l – длина проводника в метрах;

р – удельное сопротивление материала проводника в Ом? мм 2 /м.


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

Технология выполнения

Создайте форму по приведенному рис. 65.



Рис. 65. Разработанная форма примера 30 в рабочем состоянии и вывод результирующих сведений в документ word


При создании формы установите необходимые свойства элементов. Установите свойство Locked элемента TextBox6 как True, чтобы не допустить случайного ввода пользователем в него текста.

Описание процедур

If Documents.Count = 0 Then Documents.Add

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

Selection.Collapse direction:=wdCollapseEnd

Private Sub TextBox1_Change()

Private Sub TextBox2_Change()

Private Sub TextBox3_Change()

Private Sub TextBox4_Change()

Private Sub TextBox5_Change()

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

TextBox6.Text = ""

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

Функция Str делает преобразование, обратное тому, что производит Val, – конвертирует числовое значение выражения в строковое, что позволяет этому значению в дальнейшем обрабатываться как строке.

Таким образом, функции Val и Str преобразуют типы данных обрабатываемых ими переменных, соответственно, из строкового в числовой и из числового в строковый (см. главу 3).

Создание кнопки или панели в Word

Назначить форме кнопку или пункт меню для непосредственного вызова приложения из Word нельзя – это можно сделать только для модулей. Поэтому нужно применить следующий способ. Создайте макрос (Меню + Insert + Module) в открытом проекте:

Переименуйте этот макрос по своему усмотрению, например Teplo. И выполните следующие действия.

1. Щелкните правой кнопкой мыши в любом месте панели инструментов.

2. В этом меню выберите команду Настройка (или Сервис + Настройка).

3. В диалоговом окне Настройка щелкните на ярлыке вкладки Команды .

4. Прокрутите список Категории вниз и найдите пункт Макросы . Выберите этот пункт. В списке «Сохранить в» выберите имя вашего документа, в котором создан макрос (рис. 66).


Рис. 66. Поиск макроса для создания кнопки


5. В правом окне найдите необходимый макрос (либо VBA-программу).

6. Перетащите имя этого макроса или программы на панель инструментов.

7. Создайте соответствующую надпись кнопки и, если нужно, рисунок (при помощи правой кнопки мыши).

8. Закройте диалоговое окно Настройка, чтобы завершить работу.

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

Пример 31. Создать программу, позволяющую заполнять стандартные заявления студентов учебного заведения, если все необходимые данные заполняются в соответсвующих текстовых полях формы, а причина пропусков занятий выбирается из раскрывающегося списка (рис. 67, 68).



Рис. 67. Разработанная форма примера 31 в рабочем состоянии


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

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

Классному руководителю

группы АС-42

Сидорову О.И.

от студента(ки)

Петренко Олега Ивановича

Заявление

(Петренко Олег Иванович )(18.05.2007 )

Рис. 68.


Полученный результат вычисляется по формуле:

Результат = расстояние * (потребление бензина на 100 км) / 100*цену бензина за литр.

Учесть, что если выбрали условие поездки «на чужой машине», то цена бензина равняется 0 руб.


Рис. 69. Разработанная форма примера 32 в рабочем состоянии


Также учесть, что если при вычислении результат превысит 400 руб., то выдать сообщение «Может, пойдем на рынок?».

При создании формы придерживаться рис. 69, при выводе текста в документ Word – рис. 70.

При поездке на дачу, находящуюся на расстоянии 55 км, при цене бензина за литр 18,50 руб., потребление бензина составит 101,75 руб.

Рис. 70.


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


Рис. 71. Разработанная форма примера 33 в рабочем состоянии


При вычислении придерживаться следующих формул:

если схема вычисления простая, то

Доход = внесенная сумма + внесенная сумма * процентную ставку/100*срок/360;

если схема вычисления сложная, то

Доход = внесенная сумма + внесенная сумма * процентную ставку/100*срок/360 +0,01*(внесенная сумма * процентную ставку/100*срок/360).

При разработке интерфейса формы опираться на приведенный рис. 71, а при выводе расчетов в документ Word – рис. 72.

Отчет о доходе

На настоящий момент гражданин(ка) Евсеева Ольга Константиновна имеет на своем счету по простым процентам при начальной сумме вложения 1000 руб. за 150 дней при 2 %-ной ставке 1008,33 руб.

Рис. 72. Примерный формат вывода расчетов в документ word


Результат вычислений с соответствующими пояснениями выводится в документ Word, а в поле формы выдается числовой результат произведенных расчетов.

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

При работе придерживаться приведенных рис. 73 и 74.

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


Рис. 73. Разработанная форма примера 34 в рабочем состоянии



Рис. 74. Примерный формат вывода заявления в документ word

Глава 6

Автоматизация стандартных документов

6.1. Встроенные диалоговые окна

Диалоговые окна

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

Окно сообщений MsgBox выводит простейшие сообщения для пользователя, а окно ввода InputBox обеспечивает ввод информации.

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

Синтаксис:

InputBox(сообщение [,заголовок] [,default] [,xpos] [,ypos])

Аргументы:


сообщение – строковое выражение, отображаемое как сообщение в диалоговом окне. Может содержать несколько строк. Для разделения строк допускается использование символа возврата каретки (chr(13)), символа перевода строки (chr(10)) или комбинации этих клавиш (chr(13) & chr(10));

заголовок

Default – строковое выражение, отображаемое в поле ввода как используемое по умолчанию, если пользователь не введет другую строку. Если этот аргумент опущен, поле ввода отображается пустым;

Xpos – числовое выражение, задающее расстояние по горизонтали между левой границей диалогового окна и левым краем экрана;

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

Чтобы передать эту информацию (введенное значение в поле ввода) программе, присвойте возвращенное функцией InputBox значение строковой переменной (рис. 75), например:

strA=InputBox(«Какие места предпочитаете?»,"РЖД","У окна")

Рис. 75. Результат функции InputBox


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

Синтаксис:

MsgBox(сообщение [, кнопки] [,заголовок] [,файл_справки, раздел])

Аргументы:

сообщение – строковое выражение, отображаемое как сообщение в диалоговом окне;

кнопки – числовое выражение, представляющее сумму значений, которые указывают число и тип отображаемых кнопок, тип используемого значка, основную кнопку и модальность окна сообщения. Значение по умолчанию равно 0. Все значения данного аргумента см. в табл. 17, 18;

заголовок – строковое выражение, отображаемое в строке заголовка диалогового окна. Если этот аргумент опущен, в строку помещается имя приложения;

файл справки – строковое выражение, определяющее имя файла справки, содержащего справочные сведения о данном диалоговом окне. Если этот аргумент указан, необходимо наличие также аргумента context;

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


Таблица 17


Примечание. Первые кнопки активны по умолчанию.


Таблица 18

Значения аргумента кнопки процедуры MsgBox

Если в окне сообщения всего две кнопки, для выяснения, на какой из кнопок был щелчок, прекрасно подходит оператор If … then. Например:

If MsgBox («Начинать?», vbYesNo)= vbYes then

Операторы на действие этой кнопки

Операторы на действие другой кнопки

Пример 35 . Создать программу таким образом, чтобы при запуске формы, вводе имени в текстовое поле и нажатии на кнопку «Вывод текста» появлялось диалоговое окно, запрашивающее разрешение вывести текст (рис. 76).



Рис. 76. Форма примера 35 в режиме конструктора


Листинг работы формы

Private Sub CommandButton1_Click()

If MsgBox(«Вывести текст?», vbYesNo) = vbYes Then

If Documents.Count = 0 Then Documents.Add Selection.Text = «Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, „+ TextBox1.Text + «, и отвечает запросам всех программистов!“

Selection.Font.Color = wdColorBlue

Selection.Font.Bold = wdToggle

Selection.Font.Italic = wdToggle

В результате запуска приложения (рис. 77) в документе Word появится предложение:

Изучение работы с текстом в документе Word является важной составной частью умения программировать в VBA, Света, и отвечает запросам всех программистов!

Рис. 77. Форма примера 35 в рабочем режиме

Задачи на закрепление материала

Пример 36 . Создать форму, имитирующую простейшую игру в орла и решку (рис. 78). Игрок выставляет флажок вместо подбрасывания монеты, а компьютер после нажатия кнопки Бросание монеты запускает случайное число, соответствующее орлу или решке. При совпадении выигрывает компьютер, при несовпадении – игрок. Все действия сопровождаются всплывающими диалоговыми окнами.

Технология выполнения

1. Создайте форму для реализации этой игры.

2. Описание процедур.

Кнопка Бросание монеты

Private Sub CommandButton1_Click()

монета = Int(2 * Rnd)

If OptionButton1.Value = True Then

If монета = 0 Then MsgBox «не везет. Займись-ка лучше изучением VBA»

If монета = 1 Then MsgBox «везунчик. Поздравляю, ты выиграл»

If OptionButton2.Value = True Then


Рис. 78. Разработанная форма примера 36 в рабочем состоянии и диалоговое окно, реагирующее на результат игры

If монета = 1 Then MsgBox «не везет. Займись-ка лучше изучением VBA»

If монета = 0 Then MsgBox «везунчик. Поздравляю, ты выиграл»

Кнопка Выход из игры

Private Sub CommandButton2_Click()

Dim ima As String

intA = MsgBox(« Нажмите кнопку!», vbYesNoCancel +

vbExclamation + vbDefaultButton3, «VBA для чайников!»)

If MsgBox(«начинать?», vbYesNoCancel) = vbYes Then

ima = InputBox(«введите Ваше имя», «Пример окна ввода»)

If ima <> "" Then

MsgBox «Привет,» & ima, vbInformation, «Пример окна сообщения»

MsgBox «невежа, ты забыл ввести свое имя» & ima, vbExclamation, «еще один пример окна сообщения» End If

If MsgBox(«ты точно подумал?», vbYesNoCancel) = vbNo Then

MsgBox («ха-ха»)

Else: MsgBox « Ну наконец-таки!»

Пример 37 . В разработанном игровом приложении предусмотреть создание окна «Банк», в котором будет выводиться результат очков игрока при остановке игры. Правила игры: при выигрыше игрока добавляется единица к сумме, лежащей в банке, при проигрыше – добавляется компьютеру (отнимается из суммы, лежащей в банке).

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

Пример 38 . Смоделировать полную игру в орел и решку. Игрок вносит в банк определенную сумму денег. Во время игры нельзя добавлять деньги в банк. Игра состоит из последовательности шагов, априори конечных. На очередном шаге игрок загадывает либо орел, либо решку. Компьютер «бросает» монету. Если «монета падает той же стороной», которую задал игрок, то банк увеличивается на единицу, в противном случае – уменьшается на единицу. Игра заканчивается либо по желанию игрока, либо когда величина банка становится нулем или больше 10 000 руб. (определенная сумма). Игрок забирает себе содержимое банка. Можно предусмотреть максимальные и минимальные суммы, которые были в банке в течение всей игры.

Примечание . Можно смоделировать бросание игральной кости, используя функцию Int(6* Rnd)+1. Правила меняются: выиграл тот, кто больше бросил.

Технология выполнения

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

1. Пусть при запуске приложения появляется первое диалоговое окно (рис. 79). При нажатии на кнопку «Начать игру» появляются диалоговые окна, запрашивающие имя игрока и подтверждение начать игру (см. рис. 80). После чего появляется форма ввода ставок (см. рис. 81).

Private Sub CommandButton1_Click()

imya = InputBox(«введите ваше имя», «Регистрация», «????»)

If MsgBox(«Начинать?», vbYesNo, «Вы не передумали?») =

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


Рис. 79. Диалоговое окно запуска игры примера 38


Рис. 80. Диалоговые окна начала игры


Рис. 81. Диалоговое окно выбора ставки


Кнопка Бросок имитирует подбрасывание монеты игроком, производит расчет выигрыша и проигрыша игрока, выводя соответствующие значения в текстовые окна с сообщением счета игры (рис. 82).


Рис. 82. Главная форма примера 38, имитирующая игру в орел и решку


Кнопка Бросок

Private Sub CommandButton1_Click()

TextBox1.Value = TextBox1.Value + 1

If b = Fix(Rnd * 2 + 1) Then

TextBox4.Value = TextBox4.Value + 1

TextBox5.Value = TextBox5.Value + 1

TextBox4.Value = TextBox4.Value – 1

TextBox6.Value = TextBox6.Value + 1

If TextBox4.Value < 1 Then

MsgBox («Вы проиграли!!!»)

If Val(TextBox2.Text) < Val(TextBox4.Text) Then

TextBox2.Value = Val(TextBox4.Text)

If Val(TextBox3.Text) > Val(TextBox4.Text) Then

TextBox3.Value = Val(TextBox4.Text)

OptionButton1.Value = False

OptionButton2.Value = False

CommandButton1.Enabled = False

Кнопка Выход завершает игру, выдает итоговые сообщения (см. рис. 83).

Private Sub CommandButton2_Click()

MsgBox («Партий» + TextBox1.Value + (Chr(13)) + «в банке „ + TextBox4.Value + (Chr(13)) + „ваш максимум“ + TextBox2.Value + (Chr(13)) + „ваш минимум“ + TextBox3.Value + (Chr(13)) + „счет“ + TextBox5.Value +“:» + TextBox6.Value)

Private Sub UserForm Initialize()

Unload UserForm2

OptionButton1.Value = True

TextBox4.Value = a

Label6.Caption = imya

TextBox2.Value = TextBox4.Value

TextBox3.Value = TextBox4.Value

Рис. 83. Итоговые расчеты игры примера 38


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



Рис. 84. Объявление глобальных переменных и создание модуля запуска главной формы игры в примере 38

6.2. Создание и автоматическое заполнение бланков стандартных документов

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

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

Технология выполнения

Интерфейс шаблона и приложения

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


Рис. 85. Форма примера 39 в рабочем состоянии


Начнем с разработки бланка стандартного документа (печатной формы). Эту форму можно сделать на базе шаблона с текстовыми полями, в которые будут заноситься изменяющиеся сведения. Для этого выполните следующие команды: Файл + Создать. В правой части окна нового документа выберите раздел Шаблоны и гиперссылку На моем компьютере (рис. 86). После чего появится диалоговое окно Шаблоны (рис. 87), в котором на вкладке Общие необходимо выделить пиктограмму Новый документ и поставить переключатель Шаблон в рамке Создать.

Включите панель Формы (Вид + Панели инструментов + Формы). Для дальнейшей работы понадобится только один элемент этой панели – Текстовое поле

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



Рис. 87. Диалоговое окно Шаблоны


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


Рис. 88. Шаблон документа word, в который вносятся данные для печати


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

щелкнуть правой клавишей мыши по необходимому текстовому полю;

в появляющемся контекстном меню выбрать Свойства ;

указать значение по умолчанию (рис. 89).

Значения по умолчанию позволяют менять только те данные, которые должны изменяться нечасто. Например, оплата за обучение в основном одна и та же – 1500 руб., поэтому значение этого поля будет меняться не очень часто.



Рис. 89. Установка параметров текстового поля «сумма_опл»


Рассмотрим и другие необходимые элементы рабочего окна «Параметры текстового поля». В поле Тип указывается тип значения, которое можно помещать в поле. Можно заполнить поле Максимальная длина , хотя наиболее важным для дальнейшего использования кодом VBA является поле Закладка . Значение этого поля будет служить меткой, в которую должен устанавливаться курсор, перед помещением в документ очередной порции информации. Поэтому, как только все необходимые поля определены, нужно указать для каждого из них осмысленные метки. Для бланка документа Word, приведенного на рис. 86, зададим (последовательно) такие метки:

Фамилия – фамилия студента;

Имя – имя студента;

Отчество – отчество студента;

Группа – наименование группы;

Месяц_опл – название месяца, за который вносится оплата;

Сумма_опл – внесенная сумма;

ФИО_бух – фамилия принявшего бухгалтера;

Дата_опл – дата оплаты.

После окончания разработки формы документа сохраним его под именем Оплата за учебу в каталоге Шаблоны . На рис. 88 представлен шаблон созданного документа с изменяющимися полями.

Создание модуля Печать для шаблона документа

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


Листинг (занести в Модуль1 проекта Оплата за учебу )

" переменные формы приложения

Public фам1 As String

Public имя1 As String

Public отчество1 As String

Public групп1 As String

Public месяц As String

Public сумма As String

Public бух As String

Public дата As String

" переменные формы шаблона документа

Public фамилия As String

Public имя As String

Public отчество As String

Public группа As String

Public месяц_опл As String

Public сумма_опл As String

Public фио_бух As String

Public дата_опл As String

Dim book(8) As String

Dim dataMas(8) As String

Dim i As Integer

Sub Печать() "процедура печати бланка

"Заносим информацию в массивы bookmarmas, datamas

book(1) = «фамилия»: dataMas(1) = фамилия

book(2) = «имя»: dataMas(2) = имя

book(3) = «отчество»: dataMas(3) = отчество

book(4) = «группа»: dataMas(4) = группа

book(5) = «месяц_опл»: dataMas(5) = месяц_опл

book(6) = «сумма_опл»: dataMas(6) = сумма_опл

book(7) = «фио_бух»: dataMas(7) = фио_бух

book(8) = «дата_опл»: dataMas(8) = дата

"заполнение полей квитанции:

ActiveDocument.FormFields(ActiveDocument.Bookmarks(book(i)).Name).Result = dataMas(i)

ActiveDocument.PrintPreview Выполняется предварительный просмотр печати.

"Для того чтобы реально распечатать документ, применяется метод PrintOut объекта Application (см. Help)

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

Обратите внимание на то, что здесь все данные имеют тип String. Такие однотипные данные позволяют записывать их в поля формы в цикле, содержащем всего два оператора (см. описание листинга).

Создание модулей работы кнопок формы приложения

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

Private Sub CommandButton1_Click()

фамилия = фам1

имя = имя1

отчество = отчество1

группа = групп1

месяц_опл = месяц

сумма_опл = сумма

фио_бух = бух

дата_опл = дата

Call Печать

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

Private Sub textBox1_change()

фам1 = TextBox1.Value

Private Sub textBox2_change()

имя1 = TextBox2.Value

Private Sub textBox3_change()

отчество1 = TextBox3.Value

Private Sub textBox4_change()

групп1 = TextBox4.Value

Private Sub textBox5_change()

месяц = TextBox5.Value

Private Sub textBox6_change()

сумма = TextBox6.Value

Private Sub textBox7_change()

бух = TextBox7.Value

Private Sub textBox8_change()

дата = TextBox8.Value

Откомпилируйте программу и запустите на проверку.

Задача на закрепление материала

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

Готовый шаблон документа и форма даются на рис. 90 и 91.


Рис. 90. Пример упрощенного бланка почтового перевода с текстовыми изменяющимися полями (шаблон документа)



Занятие № 9. VBA в приложении к Word

Пакет Word в сочетании с VBA предоставляет широкие возможности для работы с текстом или фрагментами текста. Можно вызвать для обработки какой-либо абзац, предложение и т.д.

Для доступа к тем или иным фрагментам документа используют такие объекты, как Sections (разделы), Paragraphs (абзацы), Sentences (предложения), Words (слова) и др.

Words(6) дает возможность перейти к шестому
слову в документе

Sentences(11) переход к одиннадцатому предложению

После перехода к определенной части документа можно использовать объект Font , позволяющий изменять свойства шрифта. Этот объект содержит методы, находящиеся в панели меню “Формат | Шрифт”.

Объект Range является базовым в операции редактирования. Его можно рассматривать как непрерывный фрагмент текста (никак не связанный с выделенной областью), который не зависит от положения курсора. Range включает в себя такие объекты, как Words (слова) или Sentences (предложения); при обращении к ним сам объект Range указывать не нужно, тогда как для Sections (разделы) или Paragraphs (абзацы) это делать необходимо.

Объект Range поддерживает основные методы, которыми пользуются при форматировании текста (такие, как “Копировать”, “Вставить”, “Вырезать”, команды меню “Формат”).

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

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

Для записи макроса необходимо:

1. Выбрать в меню “Сервис | Макрос | Начать запись”.

2. Ввести в окне “Запись макроса” в поле “Имя макроса” имя нового макроса.

3. Выбрать в списке “Макрос доступен для” шаблон или документ, в котором будет храниться макрос.

5. Ввести в поле “Назначить макрос” кнопку “Панели” (для назначения макросу кнопки панели инструментов или команды меню); кнопку “Клавишам”(для назначения макросу сочетания клавиш); если макросу назначение не требуется, нажмите кнопку “OK”. Если в процессе работы вы часто используете какой-либо макрос, то целесообразно назначить ему кнопку или сочетание клавиш.

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

Существует одна особенность при сохранении готового документа Word, в котором находятся макросы и процедуры. Если вы вспомните работу с макросами в Excel, то при открытии готового документа там всегда задается вопрос: “Отключать макросы при открытии или нет?”. И если вы укажете, что макросы надо отключить, то подготовленные кнопки работать не будут.

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

Поэтому при сохранении документа в Word вы должны выполнить следующую последовательность действий:

2. Выбрать в меню “Сервис” пункт “Параметры безопасности”. Появится диалоговое окно “Безопасность”.

3. Щелкнуть по кнопке “Защита от макросов”, чтобы изменить уровень безопасности файла (по умолчанию установлен Высокий уровень безопасности, поэтому при повторном открытии файла ваши программы выполняться не будут).

4. Выбрать в появившемся диалоговом окне на закладке “Уровень безопасности” Средний или Низкий уровень безопасности. При выборе Среднего уровня безопасности при открытии документа будет появляться запрос на включение или отключение макросов. Для того чтобы программы и макросы в документе работали, надо выбрать “Не отключать макросы”.

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

5. Перейти на закладку “Надежные источники” и включить флажок “Доверять доступ к Visual Basic Project”.

6. Сохраните документ.

Практическая работа № 9–1 “Работа в Wоrd”

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

Порядок работы.

1. Набрать текст в редакторе WORD.

2. Выбрать в меню “Сервис | Макрос | Начать запись”.

3. Дать макросу имя (например, “Имя_Существительное”).

4. Ввести описание макроса в поле “Описание”.

5. Определить в поле “Назначить макрос” способ, с помощью которого будет вызываться макрос (кнопка или сочетание клавиш).

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

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

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

7. Нажать после записи макроса кнопку “Остановить запись”.

8. Выполнить те же действия для определения сказуемого (только цвет шрифта установить зеленый и задать двойное подчеркивание).

9. Подготовить кнопку “CommandButton1” на рабочем листе выше текста, назвать ее “Подлежащее”.

10. Просмотреть записанную программу, скопировать ее и переписать через режим написания программы Исходный текст в кнопку “Подлежащее”.

11. Проделать те же действия и для кнопки “Сказуемое”.

12. Задать уровень безопасности документа.

Практическая работа № 9–2 “Количество абзацев в документе”

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

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

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

Порядок работы.

1. Вызвать панель элементов управления (“Вид | Панели инструментов | Элементы управления”).

2. Подготовить кнопку “CommandButton1” на рабочем листе ниже текста.

3. Переименовать кнопку в “Количество абзацев”. Для этого на панели элементов управления вызовите “Свойства”. Появится панель “Properties”. Выберите свойство “Caption” и в правой колонке наберите название.

4. Придать кнопке свойство обтекания по контуру, чтобы кнопку можно было перемещать по листу. Для этого на объекте кнопка следует вызвать контекстно-зависимое меню и выбрать “Формат объекта”. Появится диалоговое окно “Формат элемента управления”. На вкладке “Положение” выбрать вариант “По контуру”.

5. Выбрать в контекстно-зависимом меню этого объекта команду “Исходный текст” или два раза щелкнуть по кнопке. Откроется редактор режима написания программы.

Алгоритм выполнения задания:

1. Объявить переменные:

a) k - переменная для подсчета количества абзацев в документе;

b) Text - переменная для формирования текста-ответа о количестве абзацев;

c) ZAGOLOVOK - переменная, которая определит область для вывода заголовка.

2. Определить количество абзацев с помощью метода Count объекта Paragraphs.

3. Сформировать текст вывода сообщения.

4. Вставить дополнительный абзац после последнего абзаца документа для вывода сообщения.

5. Вывести текст-сообщение в подготовленный абзац.

6. Сформировать область для вывода заголовка “Протоколы”.

7. Вывести название “Протоколы”.

8. Установить шрифт и размер заголовка.

9. Вставить символ конца абзаца для того, чтобы название и начало текста были на разных строках.

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

Результат выполнения программы представлен на рисунке.

Строка программы

Пункт алгоритма

Public Sub CommandButton1_Click()

Начало
Dim k As Integer 1a
Dim Text As String 1b
Dim ZAGOLOVOK As Range 1c
Dim REZULTAT As Range

Эта часть для выполнения дополнительного задания

2
Text = "Количество абзацев в этом документе - " & k & "." 3
4
ActiveDocument.Paragraphs(k + 1).Range.InsertBefore Text 5

Set REZULTAT = ActiveDocument.Paragraphs(k + 1).Range

With REZULTAT .Font.Name = "Arial" .Font.Size = 14

Font.ColorIndex = wdDarkRed End With

Эта часть для выполнения дополнительного задания
Set ZAGOLOVOK = ActiveDocument.Range(Start:=0, End:=0) 6
With ZAGOLOVOK Начало структуры With
.InsertBefore "Протоколы" 7
.Font.Name = "Arial" 8
.Font.Size = 24 8
.InsertParagraphAfter 9
End With Конец структуры With
End Sub Конец

Практическая работа № 9–3 “Количество букв а (русских) в абзаце”

Эта практическая работа выполняется с тем же документом, что и работа № 9–2 (с документом, который состоит из нескольких абзацев). Задача заключается в том, чтобы программно определить номер абзаца, в котором будет происходить подсчет букв а ; подсчитать их количество; в конце документа (или после абзаца, в котором происходил подсчет) вывести сообщение о количестве букв.

Порядок работы.

2. Подготовить кнопку на рабочем листе ниже текста “CommandButton2”.

3. Переименовать кнопку в “Количество букв а в абзаце”.

4. Придать кнопке формат обтекания по контуру, чтобы ее можно было перемещать по листу.

текст” или два раза щелкнуть по кнопке (мы попадем в редактор в режим написания программы).

1. Объявить переменные:

a) b - строковая переменная для размещения в ней выбранного абзаца в документе;

b) k - переменная для хранения количества абзацев в документе;

c) dl - переменная для хранения длины абзаца;

d) Text - переменная для формирования текста-ответа о количестве символов а в абзаце;

e) Nab - переменная для ввода номера абзаца, в котором будет происходить подсчет;

f) I - переменная для организации цикла;

g) kol - переменная для подсчета символов а ;

h) REZULTAT - переменная, которая определит область для вывода заголовка.

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

3. Определить количество абзацев в документе.

4. Проверить существование введенного номера абзаца и выдать сообщение об ошибке, если такого нет.

5. В переменную b занести текст всего абзаца.

6. Определить длину абзаца.

7. Организовать цикл по нахождению символа а .

8. Сформировать текст вывода сообщения.

9. Вставить дополнительный абзац после последнего абзаца документа для вывода сообщения.

10. Вывести текст-сообщение в подготовленный абзац.

11. Установить определенный шрифт, размер и цвет текста-сообщения.

Строка программы

Пункт алгоритма

Private Sub CommandButton2_Click() Начало программы

Начало
Dim b As String 1a
Dim k As Integer 1b
Dim dl As Long 1c
Dim Text As String 1d
Dim Nab As Integer 1e
Dim i As Long 1f
Dim REZULTAT As Range 1g
kol = 0
Nab = InputBox("Введите номер абзаца", "Подсчитаем буквы а") 2
k = ActiveDocument.Paragraphs.Count 3
If Nab > k Then 4
MsgBox "В тексте нет такого абзаца", 48, "Предупреждение" 4
End 4
End If 4
b = ActiveDocument.Paragraphs(Nab).Range 5
dl = Len(b) 6
For i = 1 To dl 7
If Mid(b, i, 1) = "а" Or Mid(b, i, 1) = "А" Then kol = kol + 1 7
Next i 7
MsgBox kol Отладочная печеть
Text = "Количество букв а в абзаце с номером "& Nab & " - " & kol & "." 8
ActiveDocument.Paragraphs(k).Range.InsertParagraphAfter 9
Set REZULTAT = ActiveDocument.Paragraphs(k + 1).Range
With REZULTAT
.InsertBefore Text 10
.Font.Name = "Arial" 11
.Font.Size = 14 11
.Font.ColorIndex = wdDarkRed 11
End With
End Sub Конец программы

Результат выполнения представлен на рисунке.

Практическая работа № 9–4 “Предложения в абзаце”

Эта практическая работа выполняется с тем же документом, что и работа № 9–2 и 9–3 (или с любым текстом, который состоит из нескольких абзацев). Задача заключается в том, чтобы программно определить номер абзаца, в котором наибольшее количество предложений; выделить сообщение о номере абзаца и о количестве предложений, используя диалоговое окно; выделить этот абзац другим цветом.

Порядок работы.

1. Вызвать панель элементов управления “Вид | Панели инструментов | Элементы управления”.

2. Подготовить кнопку “CommandButton3” на рабочем листе ниже текста.

3. Переименовать кнопку в “Предложения в абзаце”.

4. Придать ей формат обтекания по контуру, чтобы кнопку можно было перемещать по листу.

5. Выбрать в контекстно-зависимом меню этого объекта пункт “Исходный текст” или два раза щелкнуть по кнопке (попадаем в редактор в режим написания программы).

Алгоритм выполнения задания следующий:

1. Объявить переменные:

a) k - переменная для хранения количества абзацев в документе;

b) kol - переменная для хранения количества предложений в абзаце;

c) i - переменная для организации цикла;

d) Mas() - массив для занесения количества предложений в абзацах;

e) Otvet - переменная для формирования текста-ответа с результатами;

f) Max - переменная для хранения максимального количества предложений в абзаце;

g) ind - переменная для хранения номера абзаца с максимальным количеством предложений;

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

При объявлении массива нам неизвестно количество абзацев в документе. Поэтому объявление массива производим в два этапа: 1-й этап - объявление без размера Dim Mas() As Integer; 2-й этап - после определения количества абзацев в документе переопределяем размерность массива ReDim Mas(k) As Integer. Такие массивы называются динамическими.

Кроме этого, чтобы индекс массива начинался с 1, а не с 0 (для удобства работы), в редакторе в начале листа с процедурой укажите команду “Option Base 1”.

3. Переопределить размерность массива.

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

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

6. Сформировать текст вывода сообщения.

7. Вывести в диалоговом окне сообщений результат.

8. Определить область абзаца для форматирования.

9. Установить определенный шрифт, размер и цвет текста-абзаца с максимальным количеством предложений.

Строка программы

Пункт алгоритма

Private Sub CommandButton3_Click()

Начало программы
Dim k As Integer 1a
Dim kol As Integer 1b
Dim i As Integer 1c
Dim Mas() As Integer 1d
Dim otvet As String 1e
Dim Max As Integer 1f
Dim ind As Byte 1g
Dim REZULTAT As Range 1h
kol = 0: k = 0 Обнуление переменных
k = ActiveDocument.Paragraphs.Count 2
ReDim Mas(k) As Integer 3
Rem Начало программы Комментарий
For i = 1 To k 4
kol = ActiveDocument.Paragraphs(i).Range.Sentences.Count 4
Mas(i) = kol 4
Next i 4
Max = Mas(1) Подготовительная часть перед циклом
ind = 1
For i = 2 To k Начало цикла
If Mas(i) > Max Then 5
Max = Mas(i) 5
ind = i 5
End If 5
Next i Конец цикла
Rem Вывод результатов Комментарий

otvet = "Самое большое количество предложений в "

& ind & " абзаце - " & Max

6
MsgBox otvet 7
Set REZULTAT = ActiveDocument.Paragraphs(ind).Range 8
With REZULTAT Начало структуры With
.Font.Name = "Arial" 9
.Font.Size = 12 9
.Font.ColorIndex = wdDarkRed 9
End With
End Sub Конец программы

Диалоговое окно с результативным сообщением будет выглядеть так:

Результат выполнения задания представлен на рисунке.

Практическая работа № 9–5
“Слова-палиндромы”

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

Порядок работы.

1. Подготовить текст (можно придумать рассказ или стихотворение со словами-палиндромами ШАЛАШ, КАЗАК, НАГАН, МАДАМ и т.д.).

2. Вызвать панель элементов управления “Вид | Панели инструментов | Элементы управления”.

3. Подготовить кнопку “CommandButton1” на рабочем листе ниже текста.

4. Переименовать кнопку в “Палиндромы”.

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

6. Выбрать в контекстно-зависимом меню этого объекта пункт “Исходный текст” или два раза щелкнуть по кнопке.

Алгоритм выполнения задания следующий:

1. Объявить переменные:

a) Slovo - переменная для последовательного хранения выделенных слов;

b) L - переменная для хранения длины слова;

c) M - переменная, определяющая половину длины выделенного слова;

d) K - переменная для формирования 1-й половины слова;

e) D - переменная для формирования 2-й половины слова;

f) Kol - переменная для хранения количества абзацев в документе.

2. Определить количество абзацев в документе.

3. Определить область, в которой надо искать слова-палиндромы, - это все абзацы текста.

4. Организовать цикл по выделению слов в области определения.

5. Присвоить выделенное слово строковой переменой.

6. Определить длину выделенного слова.

7. Проверить длину слова. Если она равна 1, то слово проверять нет смысла.

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

9. Изменить цвет букв у слова-палиндрома.

Строка программы

Пункт алгоритма

Private Sub CommandButton1_Click()

Начало программы
Dim slovo As String 1a
Dim L As Byte 1b
Dim M As Byte 1c
1d
Dim D As String 1e
Dim kol as byte 1f
kol = ActiveDocument.Paragraphs.Count 2

Set myRange = ActiveDocument.Range

(ActiveDocument.Paragraphs(1).Range.Start,

ActiveDocument.Paragraphs(kol).Range.End)

3
For Each aword In myRange.Words 4 (Начало внешнего цикла)
slovo = aword.Text 5
L = Len(slovo) 6
If L <= 1 Then GoTo M1 7
M = Int(L / 2) Подготовка к проверке на палиндром
For I = 1 To M 8 (Начало вложенного цикла)
K = Mid$(slovo, I, 1) 8
D = Mid$(slovo, L - I + 1, 1) 8
If K <> D Then GoTo M1 8
Next I 8 (Конец вложенного цикла)
aword.Font.Size = 14 9
aword.Font.ColorIndex = wdDarkBlue 9
M1: Next aword 4 (Конец внешнего цикла)
End Sub Конец программы

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

Занятие № 10. VBA в приложении Power Point

В приложении Power Point с помощью VBA можно автоматизировать множество задач. Рассмотрим применение пользовательских форм для проектирования тестов и различных задач в PowerPoint. Кроме того, имеется возможность не только ввести информацию, но и использовать элементы управления. Для этого требуется следовать двум простым правилам:

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

2. Элементы управления необходимо разместить в диалоговых окнах.

Практическая работа № 10–1 “Умеешь ли ты считать”

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

Порядок работы:

1. Открыть Power Point и создать титульный слайд; оформить на нем пять кнопок:

2. Записать программы вызова пользовательских форм (через контекстное меню “Исходный текст”, выделив тематические кнопки).

Тексты программ кнопок:

UserForm1.Show

UserForm4.Show

Private Sub CommandButton3_Click()

UserForm3.Show

Private Sub CommandButton4_Click()

UserForm2.Show

3. Настроить кнопку “Выход” на завершение показа.

4. Спроектировать в редакторе Visual Basic пользовательскую форму UserForm1 “Сложение и вычитание от 1 до 10”.

При проектировании формы Свойство Caption для меток Label сделать пустым; отформатировать все элементы.

Объявление глобальных переменных

Public a As Integer

Public b As Integer

Public R As Integer

Public v As Integer

Public n As Integer

Public f As Integer

Private Sub CommandButton1_Click()

" a - переменная для первого числа

" b - переменная для второго числа

" R - переменная для получения результата

" v, n - переменные для подсчета верных

" и неверных ответов

" f - переменная оператора выбора

f = f + 1

Select Case f

" Присваиваем значения переменным

" a и b через RND в интервале (0;9)

b = Int(10 * Rnd())

a = Int(10 * Rnd())

" Формируем в надписях – или + и =

Label3.Caption = "-"

Label5.Caption = "="

Определяем большее из чисел, и это - первое число, меньшее - второе число:

If a > b Then

Label2.Caption = a

Label4.Caption = b

Label2.Caption = b

Label4.Caption = a

" Вычисляем результат

R = Abs(a - b)

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

v = v + 1

Label12.Caption = "Верно"

n = n + 1

Label12.Caption = "Неверно"

Label12.Caption = ""

b = Int(10 * Rnd())

a = Int(10 * Rnd())

Label2.Caption = a

Label4.Caption = b

Label3.Caption = "+"

Label5.Caption = "="

R = a + b

Написать аналогичные программы для следующих 9 примеров.

" Проверка результата в примере 10

If Val(R) = Val(TextBox1) Then

v = v + 1

Label12.Caption = "Верно"

n = n + 1

Label12.Caption = "Неверно"

" Вводим в надписи количество верных и неверных ответов, даем напутствия

Label7.Caption = "Ваш результат"

Label8.Caption = "Верно"

Label10.Caption = Str(v)

Label9.Caption = "Неверно"

Label11.Caption = Str(n)

If v = 10 Then Label12.Caption =

" Молодец!!!" Else Label12.Caption =

"Еще поработай над счетом!!!"

UserForm1.Hide

End Select

Программа кнопки “Снова”

Private Sub CommandButton2_Click()

Набираем программный код для кнопки снова (для этого щелкнем по кнопке)

"Обнуляем переменные, подсчитывающие

результат

"В надписях стираем информацию

Label10.Caption = ""

Label11.Caption = ""

Label12.Caption = ""

Label2.Caption = ""

Label4.Caption = ""

Label3.Caption = ""

Label5.Caption = ""

Label7.Caption = ""

Label8.Caption = ""

Label9.Caption = ""

Sub CLS()

TextBox1.Text = ""

В рабочем состоянии форма выглядит так:

5. Спроектировать пользовательские формы UserForm2, UserForm3, UserForm4.

6. Записать программы в кнопках.

Вид формы UserForm2 “Сложение и вычитание от 1 до 200” может быть таким:

Примерный вид формы UserForm3 “Таблица умножения”:

А вот такой может быть форма UserForm4 “Посчитай”:

7. Проверить работоспособность проекта и сохранить работу.

Практическая работа № 10–2 “Тест на Визуальный Интеллект”

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

Порядок работы:

1. Открыть Power Point, создать титульный слайд.

2. Создать посредством панели элементов кнопку “Определи свой Визуальный Интеллект” и записать (через контекстное меню “Исходный текст”) программу вызова пользовательской формы UserForm1:

Private Sub CommandButton1_Click()

UserForm1.Show

3. Создать через панель рисования кнопку “Выход”и настроить ее на завершение показа.

4. Спроектировать в редакторе Visual Basic пользовательскую форму со следующими элементами управления:

Public i As Integer

Public x As Integer

" Переменная х подсчитывает количество правильных ответов

Private Sub CommandButton1_Click()

i = i + 1

Select Case i

Label1.Caption = "Какая из фигур не соответствует общему ряду?"

UserForm1.Image1.Picture =

LoadPicture("C:\тест1.JPG")

If OptionButton4.Value = True

Then x = x + 1

OptionButton1.Value = False

OptionButton2.Value = False

OptionButton3.Value = False

OptionButton4.Value = False

UserForm1.Image1.Picture =

LoadPicture("C:\тест2.jpg")

If OptionButton1.Value = True Then x = x + 1

OptionButton1.Value = False

OptionButton2.Value = False

OptionButton3.Value = False

OptionButton4.Value = False

UserForm1.Image1.Picture =

LoadPicture("C:\тест3.jpg")

OptionButton1.Value = False

OptionButton2.Value = False

OptionButton3.Value = False

OptionButton4.Value = False

UserForm1.Image1.Picture =

LoadPicture("C:\тест4.jpg")

If OptionButton3.Value = True Then x = x + 1

OptionButton1.Value = False

OptionButton2.Value = False

OptionButton3.Value = False

OptionButton4.Value = False

UserForm1.Image1.Picture =

LoadPicture("C:\тест5.jpg")

If OptionButton4.Value = True Then x = x + 1

OptionButton1.Value = False

OptionButton2.Value = False

OptionButton3.Value = False

OptionButton4.Value = False

Label1.Caption = "Ваша оценка " & x

UserForm1.Hide

End Select

Программа кнопки “Выход”

Private Sub CommandButton2_Click()

UserForm1.Hide

5. Выбрать рисунки-тесты.

6. Вывести результат после прохождения всех пяти вопросов.

Практическая работа № 10–3 “Твой соционический тип”

Создайте презентацию, с помощью которой можно определить соционический тип.

Порядок работы:

1. Спроектировать титульный слайд; предусмотреть кнопки вызова пользовательских форм для определения соционического типа: “экстраверт - интраверт”; “сенсорик - интуит”; “логик - этик”; “иррационал - рационал”; “выход”; “узнай свой социотип” (определяются все типы).

2. Спроектировать пользовательские формы для определения социотипа:

· разработать программы для кнопок перехода на пользователькие формы описания социотипов (справочные);

· создать “OptionButton” для выбора варианта ответа;

· предусмотреть переход на формы, которые содержат справочный материал;

· создать форму для определения социотипа;

· создать форму (вызываемую при нажатии на клавишу “Кто такой экстраверт?”), которая будет содержать справочный материал;

· предусмотреть подсчет ответов при нажатии на кнопку “Далее”; при последнем нажатии должен выдаваться результат: “Вы - ЛОГИК” и т.д.;

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

Дополнительные задания

Подберите материал для создания теста-вопросника. Это может быть:

· Тест по предмету:

· Тест для определения IQ:

· Тест для определения темперамента:

· Тест ШТУР (школьный тест умственного развития):

· Тест профессий и т.д.

Надеемся, что вам был полезен изложенный материал. Желаем успеха!

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

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

Книга:

Работа с текстом в Word VBA

Работа с текстом в Word VBA

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

У объектов Range и Selection достаточно много общего, но есть и несколько ключевых отличий. Оба объекта представляют непрерывные последовательности символов, над которыми вы сможете выполнять различные операции. Оба объекта имеют много общих свойств и методов. Однако некоторые свойства и методы уникальны для выделенных областей, а другие - для диапазонов. Значительные различия состоят и в том, что объект Selection соответствует выделению в области окна: тексту, графическому изображению или любому другому объекту, в то время как объекты Range существуют независимо от выделенной области и всегда содержат текст.

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

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

* Для выделения диапазона используется его метод Select. Например, для объекта RangeR команда имеет вид RangeR. Select.

* Для получения доступа к диапазону, представляющему то же содержимое, что и выделенная область, используется свойство Range.

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

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

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

Для добавления к выделенной области слова, которое будет следовать сразу за ней, используйте такую инструкцию:

Selection.Expand(wdWord)

Вы можете использовать любую из следующих констант для расширения объекта; wdCharct er, wdWord, wdSent ence, wdParagraph, wdSection, wdStory, wdCell, wdColumn, wdRow, wdTable и (только для объектов Selection) wdLine. По умолчанию используется константа wdWord.

Теперь нам следует остановиться на одном щекотливом моменте: объекты Selection (но не диапазоны) также содержат метод Expand. Этот метод включает соответствующее средство Word, которое позволяет расширять выделенную область при перемещении указателя мыши. Каждый раз, когда программа вызывает метод Extend, выделенная область увеличивается на блок текста, который следует сразу за точкой вставки: текущее слово, предложение, абзац, выделенный фрагмент пли целый документ. Если вы указали аргумент в виде одного символа, например, Selection.Expand ("С"). выделенная область будет расширена вплоть до первого встретившегося указанного символа.

Word VBA позволяет вам повторно определять начало и конец диапазона или выделенной области. Только имейте в виду, что методы, в имени которых присутствует слово Move, изменяют расположение диапазона или выделенной области: они не перемещают текст, который содержится в указанном объекте.

Метод Move изменяет диапазон или выделенную область, начиная с их сжатия, отмечая их расположение, а в них уже нет никакого текста. Расположение совпадает с началом исходного объекта. После этого метод Move перемещает "сжатый" объект в соответствии с вашими инструкциями. По окончании перемещения вы можете использовать методы Expand и Mover,nd для наполнения объекта текстом.

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

"Расширение диапазонов и выделенных областей" раньше в этой главе). Аргумент Count представляет собой целое положительное число, если вы хотите перемешать объект вперед по документу (т.е. к его концу), или отрицательное, если вы хотите перемещать объект назад по документу. В приведенном ниже примере аргументы не заключены в скобки, поскольку возвращенное методом значение (количество перемещенных элементов) здесь не используется:

oTheRange .Move Unit: = waParagraph, Count, : = -2

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

Select-on.KoveStart Unit: = wdWord, Count:= 3

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

Еще одна пара методов, Start Of или EndOf, перемешает или расширяет начало или конец диапазона или выделенной области. Метод Start Of перемещает начало объекта обратно к началу текущего блока, в то время как метод EndOt перемешает конец объекта вперед к концу текущего блока.

Вы можете использовать аргумент Extend с любым методом для контроля над действиями Word. Если перемешаемая сторона объекта уже находится с того края, к которому вы пытаетесь ее переместить, ничею не происходит. Используйте константу wdMove для сжимания объекта или константу wdExtend для перемещения только указанной стороны. Ниже приведен соответствующий пример:

Selection. Start Of Unit:= wdSentence, Extend:= wdMove

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

Используйте метод Collapse для сжатия диапазона или выделенной области. Вы можете сжать объект к его начальной или конечной точке, используя необязательный аргумент Direction. Приведенная ниже инструкция сжимает выделенную область к ее начальной точке:

Selection.Collapse

А этот пример сжимает выделенную область к ее конечной точке:

Selection.Collapse(Direction:=wdCollapseEnd)

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

Диапазон.MoveEnd Unit:= wdCharacter, Count:= -1

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

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

Хотя использование буфера обмена для передачи текста из одного места в другое кажется вполне привычным, этот метод не всегда оказывается самым эффективным. Намного удобнее использовать свойства Text или FormattedText диапазона или выделенной области. Залайте эти свойства равными диапазону или выделенной области, содержащим текст, который вы хотите передать, и все. Объект назначения должен быть сжат до тех пор, пока передаваемый текст не должен будет заменить существующий текст в объекте.

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

With ActiveDocument.Bookmarks("TheBookmark")

ActiveDocument.Range(Start:=.Start, End=.Start)

RangeY.Text = Selection.Text

Для передачи вместе с текстом и его форматирования просто замените свойство Text свойством FormattedText.

Простейшим для запоминания приемом добавления текста является задание свойства Text диапазона или выделенной области равным тексту, который вы решили вставить. Это проиллюстрировано на примере, показанном ниже:

Range2.Text = "Эй, эй! А ведь дома-то никого нет!"

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

Используйте методы Insert Before или Insert After объектов Range или Selection для вставки текста в определенном месте документа, не затрагивая при этом существующий текст. Эти методы позволяют вставить новый текст непосредственно перед или после указанного объекта соответственно. Word включает вставленный текст в выделенную область или диапазон.

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